Compare commits

...

8 Commits

Author SHA1 Message Date
Alexey Polyakov
7426e83914 nothing 2026-05-06 19:34:14 +03:00
Alexey Polyakov
8dc3ef1731 MAX: Почистил серверный конфиг 2026-05-06 17:40:11 +03:00
Alexey Polyakov
f1ff4fd062 MAX && TT: общение в таме, и корректировки под веб морду 2026-05-06 15:58:27 +03:00
Alexey Polyakov
0b6eda6178 TG Bot: fix username 2026-05-06 15:53:14 +03:00
Alexey Polyakov
02df98cdbd TG Bot: fix 2026-05-06 15:43:30 +03:00
Alexey Polyakov
49d73200b0 fix 2026-05-06 15:39:22 +03:00
Alexey Polyakov
389a08ebce nothing 2026-05-06 15:35:23 +03:00
Alexey Polyakov
613e1b96cd Решение проблемы обработки sigterm 2026-05-06 15:25:07 +03:00
10 changed files with 503 additions and 133 deletions

View File

@@ -43,9 +43,9 @@ class ServerConfig:
### Telegram bot ### Telegram bot
telegram_bot_token = os.getenv("telegram_bot_token") or "123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ" telegram_bot_token = os.getenv("telegram_bot_token") or "123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ"
telegram_bot_enabled = bool(os.getenv("telegram_bot_enabled")) or True telegram_bot_enabled = bool(int(os.getenv("telegram_bot_enabled", 0)))
telegram_whitelist_ids = [x.strip() for x in os.getenv("telegram_whitelist_ids", "").split(",") if x.strip()] telegram_whitelist_ids = [x.strip() for x in os.getenv("telegram_whitelist_ids", "").split(",") if x.strip()]
telegram_whitelist_enabled = bool(os.getenv("telegram_whitelist_enabled")) or True telegram_whitelist_enabled = bool(int(os.getenv("telegram_whitelist_enabled", 0)))
### origins ### origins
origins = [x.strip() for x in os.getenv("origins", "").split(",") if x.strip()] if os.getenv("origins") else None origins = [x.strip() for x in os.getenv("origins", "").split(",") if x.strip()] if os.getenv("origins") else None

View File

@@ -1,7 +1,9 @@
# Импортирование библиотек # Импортирование библиотек
import asyncio import asyncio
import logging import logging
import signal
import ssl import ssl
import sys
from common.config import ServerConfig from common.config import ServerConfig
from common.push import PushService from common.push import PushService
@@ -175,11 +177,34 @@ async def main():
api["telegram_bot"] = controllers["telegrambot"] api["telegram_bot"] = controllers["telegrambot"]
tasks = [controller.launch(api) for controller in controllers.values()] loop = asyncio.get_running_loop()
running_tasks = []
def _shutdown(sig):
logging.info(f"Получен сигнал {sig}, завершаем все задачи...")
for task in running_tasks:
task.cancel()
if sys.platform != "win32":
for sig in (signal.SIGTERM, signal.SIGINT):
loop.add_signal_handler(sig, _shutdown, sig)
coros = [controller.launch(api) for controller in controllers.values()]
running_tasks.extend(asyncio.create_task(coro) for coro in coros)
# Запускаем контроллеры # Запускаем контроллеры
await asyncio.gather(*tasks) try:
await asyncio.gather(*running_tasks)
except (asyncio.CancelledError, Exception):
logging.info("Все задачи завершены, выходим")
finally:
if hasattr(db, 'close'):
db.close()
await db.wait_closed()
elif hasattr(db, 'connection') and hasattr(db.connection, 'close'):
await db.connection.close()
if __name__ == "__main__": if __name__ == "__main__":
asyncio.run(main()) asyncio.run(main())

View File

@@ -3,120 +3,334 @@ class OnemeConfig:
pass pass
SERVER_CONFIG = { SERVER_CONFIG = {
"async-tracer": 0, "account-nickname-enabled": False,
"presence-ttl": 300, "account-removal-enabled": False,
"non-contact-sync-time": 86400, "anr-config": {
"contact-batching-variant": 0, "enabled": True,
"account-nickname-enabled": True, "timeout": {
"web-ad-banner": { "low": 5000,
"enabled": False "avg": 5000,
"high": 5000
}
}, },
"edit-timeout": 0,
"reactions-menu": [],
"invite-long": "",
"calls-endpoint": "",
"calls-test-domain": "",
"max-readmarks": 100,
"max-cname-length": 200,
"max-description-length": 400,
"new-avatar-gradient-colors-enabled": True,
"max-msg-length": 4000,
"file-upload-unsupported-types": [],
"file-upload-max-size": 4294967296,
"image-quality": 0.8,
"image-width": 1920,
"image-height": 1920,
"image-size": 10000000,
"max-favorite-chats": 5,
"bot-complaint-enabled": True,
"reactions-max": 8,
"welcome-sticker-ids": [],
"edit-chat-type-screen-enabled": True,
"edit-channel-type-screen-enabled": True,
"esia-verify-botId": 0,
"official-org": False,
"esia-enabled": False,
"calls-debug-mode": False,
"channels-suggests-folder": True,
"delete-msg-fys-large-chat-disabled": False,
"calls-web-download-logs": False,
"calls-web-upload-logs": False,
"calls-video-zoom": False,
"calls-fullscreen-mode": False,
"group-call-part-limit": 100,
"call-chat-members-load-config": {},
"cfs": False,
"cse": False,
"calls-hotkeys": True,
"gc-link-pre-settings": False,
"gc-from-p2p": False,
"call-rate": {},
"channels-enabled": True,
"max-participants": 20000,
"max-added-participants": 100,
"saved-messages-aliases": [],
"author-visibility-forward-enabled": False,
"official-bot-naming-enabled": False,
"search-webapps-showcase": {
"items": []
},
"settings-entry-banners": [],
"settings-business": "https://telegram.org/blog/telegram-business",
"appearance-multi-theme-screen-enabled": True, "appearance-multi-theme-screen-enabled": True,
"moscow-theme-enabled": True, "audio-transcription-locales": [],
"creation-2fa-config": { "available-complaints": [
"enabled": False, "FAKE",
"pass_min_len": 6, "SPAM",
"pass_max_len": 64, "PORNO",
"hint_max_len": 30 "EXTREMISM",
"THREAT",
"OTHER"
],
"avatars-screen-enabled": True,
"bad-networ-indicator-config": {
"signalingConfig": {
"dcReportNetworkStatEnabled": False
}
}, },
"lebedev-theme-enabled": True, "bots-channel-adding": True,
"quotes-enabled": True, "cache-msg-preprocess": True,
"call-incoming-ab": 2,
"call-permissions-interval": 259200,
"call-pinch-to-zoom": True,
"call-rate": {
"limit": 3,
"sdk-limit": 2,
"duration": 10,
"delay": 86400
},
"callDontUseVpnForRtp": False,
"callEnableIceRenomination": False,
"calls-endpoint": "",
"calls-sdk-am-speaker-fix": True,
"calls-sdk-audio-dynamic-redundancy": {
"mab": 16,
"dsb": 64,
"nl": True,
"df": True,
"dlb": True
},
"calls-sdk-enable-nohost": True,
"calls-sdk-incall-stat": False,
"calls-sdk-linear-opus-bwe": True,
"calls-sdk-mapping": {
"off": True
},
"calls-sdk-remove-nonopus-audiocodecs": True,
"calls-use-call-end-reason-fix": True,
"calls-use-ws-url-validation": True,
"cfs": True,
"channels-complaint-enabled": True, "channels-complaint-enabled": True,
"reactions-settings-enabled": True, "channels-enabled": True,
"channel-statistics-botid": 0, "channels-search-subscribers-visible": True,
"enable-unknown-contact-bottom-sheet": 0, "chat-complaint-enabled": False,
"chat-gif-autoplay-enabled": True,
"chat-history-notif-msg-strategy": 1,
"chat-history-persist": False,
"chat-history-warm-opts": 0,
"chat-invite-link-permissions-enabled": True,
"chat-media-scrollable-caption-enabled": True,
"chat-video-autoplay-enabled": True,
"chat-video-call-button": True,
"chatlist-subtitle-ver": 1,
"chats-folder-enabled": True,
"chats-page-size": 50,
"chats-preload-period": 15,
"cis-enabled": True,
"contact-add-bottom-sheet": True,
"creation-2fa-config": {
"pass_min_len": 6,
"pass_max_len": 64,
"hint_max_len": 30,
"enabled": True
},
"debug-profile-info": False,
"default-reactions-settings": {
"isActive": True,
"count": 8,
"included": False,
"reactionIds": []
},
"delete-msg-fys-large-chat-disabled": True,
"devnull": {
"opcode": True,
"upload_hang": True
},
"disconnect-timeout": 300,
"double-tap-reaction": "👍",
"double-tap-reaction-enabled": True,
"drafts-sync-enabled": False,
"edit-chat-type-screen-enabled": False,
"edit-timeout": 604800,
"enable-filters-for-folders": True,
"enable-unknown-contact-bottom-sheet": 2,
"fake-chats": True,
"family-protection-botid": 67804175,
"february-23-26-theme": True,
"file-preview": True,
"file-upload-enabled": True,
"file-upload-max-size": 4294967296,
"file-upload-unsupported-types": [
"exe"
],
"force-play-embed": True,
"gc-from-p2p": True,
"gce": False,
"group-call-part-limit": 100,
"grse": False,
"gsse": True,
"hide-incoming-call-notif": True,
"host-reachability": True,
"image-height": 1920,
"image-quality": 0.800000011920929,
"image-size": 40000000,
"image-width": 1920,
"in-app-review-triggers": 255,
"informer-enabled": True, "informer-enabled": True,
"family-protection-botid": 0, "inline-ev-player": True,
"new-year-theme-2026": True, "invalidate-db-msg-exception": True,
"invite-friends-sheet-frequency": [
2,
7
],
"invite-link": "",
"invite-long": "",
"invite-short": "",
"join-requests": True,
"js-download-delegate": False,
"keep-connection": 2,
"lebedev-theme-enabled": True,
"lgce": True,
"markdown-enabled": True,
"markdown-menu": 0,
"max-audio-length": 3600,
"max-description-length": 400,
"max-favorite-chats": 5,
"max-favorite-sticker-sets": 100,
"max-favorite-stickers": 100,
"max-msg-length": 4000,
"max-participants": 20000,
"max-readmarks": 100,
"max-theme-length": 200,
"max-video-duration-download": 1200,
"max-video-message-length": 60,
"media-order": 1,
"media-playlist-enabled": True,
"media-transform": {
"enabled": True,
"hdr_enabled": False,
"hevc_enabled": True,
"max_enc_frames": {
"low": 1,
"avg": 1,
"high": 2
}
},
"media-viewer-rotation-enabled": True,
"media-viewer-video-collage-enabled": True,
"mentions-enabled": True,
"mentions_entity_names_limit": 3,
"migrate-unsafe-warn": True,
"min-image-side-size": 64,
"miui-menu-enabled": True,
"money-transfer-botid": 1134691,
"moscow-theme-enabled": True,
"msg-get-reactions-page-size": 40,
"music-files-enabled": False,
"mytracker-enabled": True,
"net-client-dns-enabled": True,
"net-session-suppress-bad-disconnected-state": True,
"net-stat-config": [
64,
48,
128,
135
],
"new-admin-permissions": True,
"new-logout-logic": False,
"new-media-upload-ui": True,
"new-media-viewer-enabled": True,
"new-settings-storage-screen-enabled": False,
"new-width-text-bubbles-mob": True,
"new-year-theme-2026": False,
"nick-max-length": 60,
"nick-min-length": 7,
"official-org": True,
"one-video-failover": True,
"one-video-player": True,
"one-video-uploader": True,
"one-video-uploader-audio": True,
"one-video-uploader-progress-fix": True,
"perf-events": {
"startup_report": 2,
"web_app": 2
},
"player-load-control": {
"mp_autoplay_enabled": False,
"time_over_size": False,
"buffer_after_rebuffer_ms": 3000,
"buffer_ms": 500,
"max_buffer_ms": 13000,
"min_buffer_ms": 5000,
"use_min_size_lc": True,
"min_size_lc_fmt_mis_sf": 4
},
"progress-diff-for-notify": 1,
"push-delivery": True,
"qr-auth-enabled": True,
"quotes-enabled": True,
"react-errors": [
"error.comment.chat.access",
"error.comment.invalid",
"error.message.invalid",
"error.message.chat.access",
"error.message.like.unknown.like",
"error.message.like.unknown.reaction",
"error.too-many-unlikes-dialog",
"error.too-many-unlikes-chat",
"error.too-many-likes",
"error.reactions.not.allowed"
],
"react-permission": 2,
"reactions-enabled": True,
"reactions-max": 8,
"reactions-menu": [
"👍",
"❤️",
"🤣",
"🔥",
"😭",
"💯",
"💩",
"😡"
],
"reactions-settings-enabled": True,
"reconnect-call-ringtone": True,
"ringtone-am-mode": True,
"saved-messages-aliases": [
"избранное",
"saved",
"favourite",
"favorite",
"личное",
"моё",
"мои",
"мой",
"моя",
"любимое",
"сохраненные",
"сохраненное",
"заметки",
"закладки"
],
"scheduled-messages-enabled": True, "scheduled-messages-enabled": True,
"scheduled-posts-enabled": True, "scheduled-posts-enabled": True,
"scheduled-faves-enabled": True, "search-webapps-showcase": {
"non-contact-complaints-enabled": True, "items": []
"join-requests": True, },
"web-persistent-cache": False, "send-location-enabled": True,
"create-channel-type-screen": True, "send-logs-interval-sec": 900,
"server-side-complains-enabled": True,
"set-audio-device": False,
"set-unread-timeout": 31536000,
"settings-entry-banners": [],
"show-reactions-on-multiselect": True,
"show-warning-links": True, "show-warning-links": True,
"speedy-upload": True,
"speedy-voice-messages": True,
"sse": True,
"stat-session-background-threshold": 60000,
"sticker-suggestion": [
"RECENT",
"NEW",
"TOP"
],
"stickers-controller-suspend": True,
"stickers-db-batch": True,
"streamable-mp4": True,
"stub": "stub2",
"suspend-video-converter": True,
"system-default-ringtone-opt": True,
"transfer-botid": 1134691,
"typing-enabled-FILE": True,
"unique-favorites": True,
"unsafe-files-alert": True,
"upload-reusability": True,
"upload-rx-no-blocking": True,
"user-debug-report": 2340932,
"video-msg-channels-enabled": True,
"video-msg-config": {
"duration": 60,
"quality": 480,
"min_frame_rate": 30,
"max_frame_rate": 30
},
"video-msg-enabled": True,
"video-transcoding-class": [
2,
3
],
"views-count-enabled": True,
"watchdog-config": {
"enabled": True,
"stuck": 10,
"hang": 60
},
"webapp-exc": [],
"webapp-push-open": True,
"webview-cache-enabled": False,
"welcome-sticker-ids": [],
"white-list-links": [], "white-list-links": [],
"february-23-26-theme": True, "wm-analytics-enabled": True,
"march-8-26-theme": True, "wm-workers-limit": 80,
"audio-play-cmd": False, "wud": False,
"audio-play-opus": False,
"bots-channel-adding": True,
"stickers-botid": 0,
"sticker-set-edit-enabled": True,
"calls-new-history-enabled": True,
"y-map": { "y-map": {
"tile": "", "tile": "34c7fd82-723d-4b23-8abb-33376729a893",
"geocoder": "", "geocoder": "34c7fd82-723d-4b23-8abb-33376729a893",
"static": "" "static": "34c7fd82-723d-4b23-8abb-33376729a893",
"logoLight": "https://st.max.ru/icons/ya_maps_logo_light.webp",
"logoDark": "https://st.max.ru/icons/ya_maps_logo_dark.webp"
}, },
"enable-audio-messages-transcription": True, "has-phone": True
"enable-video-messages-transcription": True, }
"retry-transcribe-attempt": 5,
"retry-transcribe-timeout": 2000,
"org-profile": False,
"media-not-ready-retry-delay": 2000,
"polls-in-chats": True,
"polls-in-channels": True,
"render-polls": True,
"poll-ttl": {
"chat": 5000,
"bigchat": 15000,
"channel": 25000
},
"new-collage": False,
"channel-profile-invite-link": False,
"rename-profile-to-settings": True,
"live-streams": True
}

View File

@@ -10,13 +10,18 @@ from common.opcodes import Opcodes
class OnemeController(ControllerBase): class OnemeController(ControllerBase):
def __init__(self): def __init__(self):
self.config = ServerConfig() self.config = ServerConfig()
self.proto = MobileProto() self.proto_tcp = MobileProto()
self.proto_web = WebProto()
self.opcodes = Opcodes() self.opcodes = Opcodes()
async def event(self, target, client, eventData): async def event(self, target, client, eventData):
# Извлекаем тип события и врайтер # Извлекаем тип события и врайтер
eventType = eventData.get("eventType") eventType = eventData.get("eventType")
writer = client.get("writer") writer = client.get("writer")
is_web = client.get("type") == "web"
# Выбираем протокол в зависимости от типа подключения
proto = self.proto_web if is_web else self.proto_tcp
# Не отправляем событие самому себе # Не отправляем событие самому себе
if writer == eventData.get("writer"): if writer == eventData.get("writer"):
@@ -41,7 +46,7 @@ class OnemeController(ControllerBase):
} }
# Создаем пакет # Создаем пакет
packet = self.proto.pack_packet( packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_MESSAGE, payload=payload cmd=0, seq=1, opcode=self.opcodes.NOTIF_MESSAGE, payload=payload
) )
elif eventType == "typing": elif eventType == "typing":
@@ -58,7 +63,7 @@ class OnemeController(ControllerBase):
} }
# Создаем пакет # Создаем пакет
packet = self.proto.pack_packet( packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_TYPING, payload=payload cmd=0, seq=1, opcode=self.opcodes.NOTIF_TYPING, payload=payload
) )
elif eventType == "profile_updated": elif eventType == "profile_updated":
@@ -71,7 +76,7 @@ class OnemeController(ControllerBase):
} }
# Создаем пакет # Создаем пакет
packet = self.proto.pack_packet( packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_PROFILE, payload=payload cmd=0, seq=1, opcode=self.opcodes.NOTIF_PROFILE, payload=payload
) )
elif eventType == "presence": elif eventType == "presence":
@@ -85,13 +90,16 @@ class OnemeController(ControllerBase):
"time": event_time "time": event_time
} }
packet = self.proto.pack_packet( packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload
) )
# Отправляем пакет # Отправляем пакет
writer.write(packet) if is_web:
await writer.drain() await writer.send(packet)
else:
writer.write(packet)
await writer.drain()
def launch(self, api): def launch(self, api):
async def _start_all(): async def _start_all():

View File

@@ -431,5 +431,9 @@ class OnemeMobile:
self.logger.info(f"Сокет запущен на порту {self.port}") self.logger.info(f"Сокет запущен на порту {self.port}")
async with self.server: try:
await self.server.serve_forever() async with self.server:
await self.server.serve_forever()
except asyncio.CancelledError:
self.server.close()
await self.server.wait_closed()

View File

@@ -2,6 +2,7 @@ import logging
import time import time
import traceback import traceback
import websockets import websockets
import asyncio
from common.proto_web import WebProto from common.proto_web import WebProto
from oneme.processors import Processors from oneme.processors import Processors
from common.rate_limiter import RateLimiter from common.rate_limiter import RateLimiter
@@ -319,7 +320,8 @@ class OnemeWS:
"writer": websocket, "writer": websocket,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "oneme" "protocol": "oneme",
"type": "web"
} }
) )
else: else:
@@ -333,7 +335,8 @@ class OnemeWS:
"writer": websocket, "writer": websocket,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "oneme" "protocol": "oneme",
"type": "web"
} }
] ]
} }
@@ -410,4 +413,9 @@ class OnemeWS:
self.logger.info(f"WebSocket запущен на порту {self.port}") self.logger.info(f"WebSocket запущен на порту {self.port}")
await self.server.wait_closed() try:
await self.server.wait_closed()
except asyncio.CancelledError:
self.server.close()
await self.server.wait_closed()
raise

View File

@@ -3,10 +3,103 @@ from tamtam.socket import TamTamMobile
from tamtam.websocket import TamTamWS from tamtam.websocket import TamTamWS
from classes.controllerbase import ControllerBase from classes.controllerbase import ControllerBase
from common.config import ServerConfig from common.config import ServerConfig
from common.proto_tcp import MobileProto
from common.proto_web import WebProto
from common.opcodes import Opcodes
class TTController(ControllerBase): class TTController(ControllerBase):
def __init__(self): def __init__(self):
self.config = ServerConfig() self.config = ServerConfig()
self.proto_tcp = MobileProto()
self.proto_web = WebProto()
self.opcodes = Opcodes()
async def event(self, target, client, eventData):
# Извлекаем тип события и врайтер
eventType = eventData.get("eventType")
writer = client.get("writer")
is_web = client.get("type") == "web"
# Выбираем протокол в зависимости от типа подключения
proto = self.proto_web if is_web else self.proto_tcp
# Не отправляем событие самому себе
if writer == eventData.get("writer"):
return
# Обрабатываем событие
if eventType == "new_msg":
# Данные сообщения
chatId = eventData.get("chatId")
message = eventData.get("message")
prevMessageId = eventData.get("prevMessageId")
time = eventData.get("time")
# Данные пакета
payload = {
"chatId": chatId,
"message": message,
"prevMessageId": prevMessageId,
"ttl": False,
"unread": 0,
"mark": time
}
# Создаем пакет
packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_MESSAGE, payload=payload
)
elif eventType == "typing":
# Данные события
chatId = eventData.get("chatId")
userId = eventData.get("userId")
type = eventData.get("type")
# Данные пакета
payload = {
"chatId": chatId,
"userId": userId,
"type": type
}
# Создаем пакет
packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_TYPING, payload=payload
)
elif eventType == "profile_updated":
# Данные события
profile = eventData.get("profile")
# Данные пакета
payload = {
"profile": profile
}
# Создаем пакет
packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_PROFILE, payload=payload
)
elif eventType == "presence":
userId = eventData.get("userId")
presence = eventData.get("presence")
event_time = eventData.get("time")
payload = {
"userId": userId,
"presence": presence,
"time": event_time
}
packet = proto.pack_packet(
cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload
)
# Отправляем пакет
if is_web:
await writer.send(packet)
else:
writer.write(packet)
await writer.drain()
def launch(self, api): def launch(self, api):
async def _start_all(): async def _start_all():

View File

@@ -199,7 +199,8 @@ class TamTamMobile:
"writer": writer, "writer": writer,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "tamtam" "protocol": "tamtam",
"type": "tcp"
} }
) )
else: else:
@@ -211,7 +212,8 @@ class TamTamMobile:
"writer": writer, "writer": writer,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "tamtam" "protocol": "tamtam",
"type": "tcp"
} }
] ]
} }
@@ -239,5 +241,9 @@ class TamTamMobile:
self.logger.info(f"Сокет запущен на порту {self.port}") self.logger.info(f"Сокет запущен на порту {self.port}")
async with self.server: try:
await self.server.serve_forever() async with self.server:
await self.server.serve_forever()
except asyncio.CancelledError:
self.server.close()
await self.server.wait_closed()

View File

@@ -1,6 +1,7 @@
import logging import logging
import traceback import traceback
import websockets import websockets
import asyncio
from common.proto_web import WebProto from common.proto_web import WebProto
from tamtam.processors import Processors from tamtam.processors import Processors
from common.rate_limiter import RateLimiter from common.rate_limiter import RateLimiter
@@ -186,7 +187,8 @@ class TamTamWS:
"writer": websocket, "writer": websocket,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "tamtam" "protocol": "tamtam",
"type": "web"
} }
) )
else: else:
@@ -198,7 +200,8 @@ class TamTamWS:
"writer": websocket, "writer": websocket,
"ip": addr[0], "ip": addr[0],
"port": addr[1], "port": addr[1],
"protocol": "tamtam" "protocol": "tamtam",
"type": "web"
} }
] ]
} }
@@ -229,4 +232,9 @@ class TamTamWS:
self.logger.info(f"TT WebSocket запущен на порту {self.port}") self.logger.info(f"TT WebSocket запущен на порту {self.port}")
await self.server.wait_closed() try:
await self.server.wait_closed()
except asyncio.CancelledError:
self.server.close()
await self.server.wait_closed()
raise

View File

@@ -83,6 +83,10 @@ class TelegramBot:
updatetime = str(int(time.time() * 1000)) updatetime = str(int(time.time() * 1000))
lastseen = str(int(time.time())) lastseen = str(int(time.time()))
firstname = message.from_user.first_name[:59]
lastname = (message.from_user.last_name or "")[:59]
username = (message.from_user.username or f"user{int(time.time() * 1000)}")[:60]
try: try:
# Создаем юзера # Создаем юзера
await cursor.execute( await cursor.execute(
@@ -90,9 +94,9 @@ class TelegramBot:
( (
new_phone, # phone new_phone, # phone
tg_id, # telegram_id tg_id, # telegram_id
message.from_user.first_name[:59], # firstname firstname, # firstname
(message.from_user.last_name or "")[:59], # lastname lastname, # lastname
(message.from_user.username or "")[:60], # username username, # username
json.dumps([]), # profileoptions json.dumps([]), # profileoptions
json.dumps(["TT", "ONEME"]), # options json.dumps(["TT", "ONEME"]), # options
0, # accountstatus 0, # accountstatus
@@ -131,7 +135,7 @@ class TelegramBot:
async def start(self): async def start(self):
if self.enabled: if self.enabled:
try: try:
await self.dp.start_polling(self.bot) await self.dp.start_polling(self.bot, handle_signals=False)
except Exception as e: except Exception as e:
self.logger.error(f"Ошибка запуска Telegram бота: {e}") self.logger.error(f"Ошибка запуска Telegram бота: {e}")
else: else: