Update database schema to use AUTOINCREMENT for user IDs and enforce UNIQUE constraint on destination.
Improve error handling for topic and emoticon loading. Update time command to use server time directly. Adjust effective limit calculation to use DISPLAY_LIMIT.
This commit is contained in:
27
meshchat.mu
27
meshchat.mu
@@ -18,9 +18,9 @@ if not os.path.exists(DB_PATH):
|
|||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
remote_identity TEXT,
|
remote_identity TEXT,
|
||||||
dest TEXT,
|
dest TEXT UNIQUE NOT NULL,
|
||||||
display_name TEXT
|
display_name TEXT
|
||||||
);
|
);
|
||||||
""")
|
""")
|
||||||
@@ -274,14 +274,16 @@ safe_username = (
|
|||||||
|
|
||||||
# Функции темы чата
|
# Функции темы чата
|
||||||
topic_file = os.path.join(os.path.dirname(__file__), "topic.json")
|
topic_file = os.path.join(os.path.dirname(__file__), "topic.json")
|
||||||
|
topic_data = {}
|
||||||
try:
|
try:
|
||||||
with open(topic_file, "r") as tf:
|
with open(topic_file, "r") as tf:
|
||||||
topic_data = json.load(tf)
|
topic_data = json.load(tf)
|
||||||
topic_text = topic_data.get("text", "Добро пожаловать в чат!")
|
topic_text = topic_data.get("text", "Добро пожаловать в чат!")
|
||||||
topic_author = topic_data.get("user", "System")
|
topic_author = topic_data.get("user", "System")
|
||||||
except:
|
except (IOError, json.JSONDecodeError, KeyError):
|
||||||
topic_text = "Добро пожаловать в чат!"
|
topic_text = "Добро пожаловать в чат!"
|
||||||
topic_author = "System"
|
topic_author = "System"
|
||||||
|
topic_data = {}
|
||||||
|
|
||||||
|
|
||||||
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
||||||
@@ -549,7 +551,7 @@ elif cmd == "/time":
|
|||||||
try:
|
try:
|
||||||
import pytz, datetime
|
import pytz, datetime
|
||||||
user_time = datetime.datetime.now(pytz.timezone("Europe/Rome")).strftime("%Y-%m-%d %H:%M:%S")
|
user_time = datetime.datetime.now(pytz.timezone("Europe/Rome")).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
except:
|
except (ImportError, AttributeError, OSError):
|
||||||
user_time = "(Local time not available)"
|
user_time = "(Local time not available)"
|
||||||
time_text = f"Server time: {server_time} // User time (Naples): {user_time}"
|
time_text = f"Server time: {server_time} // User time (Naples): {user_time}"
|
||||||
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": time_text})
|
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": time_text})
|
||||||
@@ -672,7 +674,6 @@ elif cmd == "/e":
|
|||||||
emojis = [line.strip() for line in f if line.strip()]
|
emojis = [line.strip() for line in f if line.strip()]
|
||||||
|
|
||||||
if emojis and safe_username:
|
if emojis and safe_username:
|
||||||
import random
|
|
||||||
chosen = random.choice(emojis)
|
chosen = random.choice(emojis)
|
||||||
|
|
||||||
# Treat emoji as a normal message
|
# Treat emoji as a normal message
|
||||||
@@ -708,8 +709,6 @@ elif cmd.startswith("/c "):
|
|||||||
user_message = message[3:].strip().replace("`", "") # Remove backticks to avoid formatting issues
|
user_message = message[3:].strip().replace("`", "") # Remove backticks to avoid formatting issues
|
||||||
|
|
||||||
if user_message and safe_username:
|
if user_message and safe_username:
|
||||||
import random, json
|
|
||||||
|
|
||||||
def hex_brightness(hex_code):
|
def hex_brightness(hex_code):
|
||||||
r = int(hex_code[0], 16)
|
r = int(hex_code[0], 16)
|
||||||
g = int(hex_code[1], 16)
|
g = int(hex_code[1], 16)
|
||||||
@@ -1257,12 +1256,18 @@ def highlight_mentions_in_line(line, known_users):
|
|||||||
return re.sub(r"@(\w+)", replacer, line)
|
return re.sub(r"@(\w+)", replacer, line)
|
||||||
|
|
||||||
######## $E ДЛЯ ЭМОТИКОНОВ ########
|
######## $E ДЛЯ ЭМОТИКОНОВ ########
|
||||||
with open(EMO_DB, "r", encoding="utf-8") as f:
|
EMOTICONS = []
|
||||||
EMOTICONS = []
|
try:
|
||||||
for line in f:
|
with open(EMO_DB, "r", encoding="utf-8") as f:
|
||||||
EMOTICONS.extend(line.strip().split())
|
for line in f:
|
||||||
|
EMOTICONS.extend(line.strip().split())
|
||||||
|
except (IOError, OSError):
|
||||||
|
EMOTICONS = [":)", ":(", ":D", ":P"]
|
||||||
|
|
||||||
# $e catching for emoticons in messages
|
# $e catching for emoticons in messages
|
||||||
def substitute_emoticons_in_line(line):
|
def substitute_emoticons_in_line(line):
|
||||||
|
if not EMOTICONS:
|
||||||
|
return line
|
||||||
return re.sub(r"\$e", lambda _: random.choice(EMOTICONS), line)
|
return re.sub(r"\$e", lambda _: random.choice(EMOTICONS), line)
|
||||||
|
|
||||||
######## УПОМИНАНИЯ ССЫЛОК ######
|
######## УПОМИНАНИЯ ССЫЛОК ######
|
||||||
|
|||||||
30
nomadnet.mu
30
nomadnet.mu
@@ -18,9 +18,9 @@ if not os.path.exists(DB_PATH):
|
|||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
remote_identity TEXT,
|
remote_identity TEXT,
|
||||||
dest TEXT,
|
dest TEXT UNIQUE NOT NULL,
|
||||||
display_name TEXT
|
display_name TEXT
|
||||||
);
|
);
|
||||||
""")
|
""")
|
||||||
@@ -274,14 +274,16 @@ safe_username = (
|
|||||||
|
|
||||||
# Функции темы чата
|
# Функции темы чата
|
||||||
topic_file = os.path.join(os.path.dirname(__file__), "topic.json")
|
topic_file = os.path.join(os.path.dirname(__file__), "topic.json")
|
||||||
|
topic_data = {}
|
||||||
try:
|
try:
|
||||||
with open(topic_file, "r") as tf:
|
with open(topic_file, "r") as tf:
|
||||||
topic_data = json.load(tf)
|
topic_data = json.load(tf)
|
||||||
topic_text = topic_data.get("text", "Добро пожаловать в чат!")
|
topic_text = topic_data.get("text", "Добро пожаловать в чат!")
|
||||||
topic_author = topic_data.get("user", "System")
|
topic_author = topic_data.get("user", "System")
|
||||||
except:
|
except (IOError, json.JSONDecodeError, KeyError):
|
||||||
topic_text = "Добро пожаловать в чат!"
|
topic_text = "Добро пожаловать в чат!"
|
||||||
topic_author = "System"
|
topic_author = "System"
|
||||||
|
topic_data = {}
|
||||||
|
|
||||||
|
|
||||||
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
||||||
@@ -545,8 +547,7 @@ elif cmd == "/info":
|
|||||||
|
|
||||||
############ КОМАНДА TIME ###############
|
############ КОМАНДА TIME ###############
|
||||||
elif cmd == "/time":
|
elif cmd == "/time":
|
||||||
from datetime import datetime
|
server_time = time.strftime("%A, %B %d, %Y at %H:%M:%S UTC")
|
||||||
server_time = datetime.utcnow().strftime("%A, %B %d, %Y at %H:%M:%S UTC")
|
|
||||||
time_text = f"Текущее время сервера: {server_time}"
|
time_text = f"Текущее время сервера: {server_time}"
|
||||||
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": time_text})
|
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": time_text})
|
||||||
|
|
||||||
@@ -668,7 +669,6 @@ elif cmd == "/e":
|
|||||||
emojis = [line.strip() for line in f if line.strip()]
|
emojis = [line.strip() for line in f if line.strip()]
|
||||||
|
|
||||||
if emojis and safe_username:
|
if emojis and safe_username:
|
||||||
import random
|
|
||||||
chosen = random.choice(emojis)
|
chosen = random.choice(emojis)
|
||||||
|
|
||||||
# Treat emoji as a normal message
|
# Treat emoji as a normal message
|
||||||
@@ -704,8 +704,6 @@ elif cmd.startswith("/c "):
|
|||||||
user_message = message[3:].strip().replace("`", "") # Remove backticks to avoid formatting issues
|
user_message = message[3:].strip().replace("`", "") # Remove backticks to avoid formatting issues
|
||||||
|
|
||||||
if user_message and safe_username:
|
if user_message and safe_username:
|
||||||
import random, json
|
|
||||||
|
|
||||||
def hex_brightness(hex_code):
|
def hex_brightness(hex_code):
|
||||||
r = int(hex_code[0], 16)
|
r = int(hex_code[0], 16)
|
||||||
g = int(hex_code[1], 16)
|
g = int(hex_code[1], 16)
|
||||||
@@ -1205,7 +1203,7 @@ def calculate_effective_limit(log, max_lines, max_chars):
|
|||||||
|
|
||||||
return max(effective_limit, 1), total_lines
|
return max(effective_limit, 1), total_lines
|
||||||
|
|
||||||
effective_limit, total_lines = calculate_effective_limit(log, MAX_LINES, MAX_CHARS)
|
effective_limit, total_lines = calculate_effective_limit(log, DISPLAY_LIMIT, MAX_CHARS)
|
||||||
|
|
||||||
|
|
||||||
########## Динамическое преобразование времени сервера UTC в локальное время ##########
|
########## Динамическое преобразование времени сервера UTC в локальное время ##########
|
||||||
@@ -1253,12 +1251,18 @@ def highlight_mentions_in_line(line, known_users):
|
|||||||
return re.sub(r"@(\w+)", replacer, line)
|
return re.sub(r"@(\w+)", replacer, line)
|
||||||
|
|
||||||
######## $E ДЛЯ ЭМОТИКОНОВ ########
|
######## $E ДЛЯ ЭМОТИКОНОВ ########
|
||||||
with open(EMO_DB, "r", encoding="utf-8") as f:
|
EMOTICONS = []
|
||||||
EMOTICONS = []
|
try:
|
||||||
for line in f:
|
with open(EMO_DB, "r", encoding="utf-8") as f:
|
||||||
EMOTICONS.extend(line.strip().split())
|
for line in f:
|
||||||
|
EMOTICONS.extend(line.strip().split())
|
||||||
|
except (IOError, OSError):
|
||||||
|
EMOTICONS = [":)", ":(", ":D", ":P"]
|
||||||
|
|
||||||
# Перехват $e для эмотиконов в сообщениях
|
# Перехват $e для эмотиконов в сообщениях
|
||||||
def substitute_emoticons_in_line(line):
|
def substitute_emoticons_in_line(line):
|
||||||
|
if not EMOTICONS:
|
||||||
|
return line
|
||||||
return re.sub(r"\$e", lambda _: random.choice(EMOTICONS), line)
|
return re.sub(r"\$e", lambda _: random.choice(EMOTICONS), line)
|
||||||
|
|
||||||
######## УПОМИНАНИЯ ССЫЛОК ######
|
######## УПОМИНАНИЯ ССЫЛОК ######
|
||||||
|
|||||||
Reference in New Issue
Block a user