mirror of
https://github.com/openmax-server/server.git
synced 2026-05-22 19:41:41 +03:00
Compare commits
8 Commits
0f2d946b98
...
7426e83914
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7426e83914 | ||
|
|
8dc3ef1731 | ||
|
|
f1ff4fd062 | ||
|
|
0b6eda6178 | ||
|
|
02df98cdbd | ||
|
|
49d73200b0 | ||
|
|
389a08ebce | ||
|
|
613e1b96cd |
@@ -43,9 +43,9 @@ class ServerConfig:
|
||||
|
||||
### Telegram bot
|
||||
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_enabled = bool(os.getenv("telegram_whitelist_enabled")) or True
|
||||
telegram_whitelist_enabled = bool(int(os.getenv("telegram_whitelist_enabled", 0)))
|
||||
|
||||
### origins
|
||||
origins = [x.strip() for x in os.getenv("origins", "").split(",") if x.strip()] if os.getenv("origins") else None
|
||||
|
||||
29
src/main.py
29
src/main.py
@@ -1,7 +1,9 @@
|
||||
# Импортирование библиотек
|
||||
import asyncio
|
||||
import logging
|
||||
import signal
|
||||
import ssl
|
||||
import sys
|
||||
|
||||
from common.config import ServerConfig
|
||||
from common.push import PushService
|
||||
@@ -175,11 +177,34 @@ async def main():
|
||||
|
||||
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__":
|
||||
asyncio.run(main())
|
||||
|
||||
|
||||
@@ -3,120 +3,334 @@ class OnemeConfig:
|
||||
pass
|
||||
|
||||
SERVER_CONFIG = {
|
||||
"async-tracer": 0,
|
||||
"presence-ttl": 300,
|
||||
"non-contact-sync-time": 86400,
|
||||
"contact-batching-variant": 0,
|
||||
"account-nickname-enabled": True,
|
||||
"web-ad-banner": {
|
||||
"enabled": False
|
||||
"account-nickname-enabled": False,
|
||||
"account-removal-enabled": False,
|
||||
"anr-config": {
|
||||
"enabled": True,
|
||||
"timeout": {
|
||||
"low": 5000,
|
||||
"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,
|
||||
"moscow-theme-enabled": True,
|
||||
"creation-2fa-config": {
|
||||
"enabled": False,
|
||||
"pass_min_len": 6,
|
||||
"pass_max_len": 64,
|
||||
"hint_max_len": 30
|
||||
"audio-transcription-locales": [],
|
||||
"available-complaints": [
|
||||
"FAKE",
|
||||
"SPAM",
|
||||
"PORNO",
|
||||
"EXTREMISM",
|
||||
"THREAT",
|
||||
"OTHER"
|
||||
],
|
||||
"avatars-screen-enabled": True,
|
||||
"bad-networ-indicator-config": {
|
||||
"signalingConfig": {
|
||||
"dcReportNetworkStatEnabled": False
|
||||
}
|
||||
},
|
||||
"lebedev-theme-enabled": True,
|
||||
"quotes-enabled": True,
|
||||
"bots-channel-adding": 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,
|
||||
"reactions-settings-enabled": True,
|
||||
"channel-statistics-botid": 0,
|
||||
"enable-unknown-contact-bottom-sheet": 0,
|
||||
"channels-enabled": True,
|
||||
"channels-search-subscribers-visible": True,
|
||||
"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,
|
||||
"family-protection-botid": 0,
|
||||
"new-year-theme-2026": True,
|
||||
"inline-ev-player": 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-posts-enabled": True,
|
||||
"scheduled-faves-enabled": True,
|
||||
"non-contact-complaints-enabled": True,
|
||||
"join-requests": True,
|
||||
"web-persistent-cache": False,
|
||||
"create-channel-type-screen": True,
|
||||
"search-webapps-showcase": {
|
||||
"items": []
|
||||
},
|
||||
"send-location-enabled": 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,
|
||||
"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": [],
|
||||
"february-23-26-theme": True,
|
||||
"march-8-26-theme": True,
|
||||
"audio-play-cmd": False,
|
||||
"audio-play-opus": False,
|
||||
"bots-channel-adding": True,
|
||||
"stickers-botid": 0,
|
||||
"sticker-set-edit-enabled": True,
|
||||
"calls-new-history-enabled": True,
|
||||
"wm-analytics-enabled": True,
|
||||
"wm-workers-limit": 80,
|
||||
"wud": False,
|
||||
"y-map": {
|
||||
"tile": "",
|
||||
"geocoder": "",
|
||||
"static": ""
|
||||
"tile": "34c7fd82-723d-4b23-8abb-33376729a893",
|
||||
"geocoder": "34c7fd82-723d-4b23-8abb-33376729a893",
|
||||
"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,
|
||||
"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
|
||||
}
|
||||
"has-phone": True
|
||||
}
|
||||
@@ -10,13 +10,18 @@ from common.opcodes import Opcodes
|
||||
class OnemeController(ControllerBase):
|
||||
def __init__(self):
|
||||
self.config = ServerConfig()
|
||||
self.proto = MobileProto()
|
||||
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"):
|
||||
@@ -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
|
||||
)
|
||||
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
|
||||
)
|
||||
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
|
||||
)
|
||||
elif eventType == "presence":
|
||||
@@ -85,13 +90,16 @@ class OnemeController(ControllerBase):
|
||||
"time": event_time
|
||||
}
|
||||
|
||||
packet = self.proto.pack_packet(
|
||||
packet = proto.pack_packet(
|
||||
cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload
|
||||
)
|
||||
|
||||
# Отправляем пакет
|
||||
writer.write(packet)
|
||||
await writer.drain()
|
||||
if is_web:
|
||||
await writer.send(packet)
|
||||
else:
|
||||
writer.write(packet)
|
||||
await writer.drain()
|
||||
|
||||
def launch(self, api):
|
||||
async def _start_all():
|
||||
|
||||
@@ -431,5 +431,9 @@ class OnemeMobile:
|
||||
|
||||
self.logger.info(f"Сокет запущен на порту {self.port}")
|
||||
|
||||
async with self.server:
|
||||
await self.server.serve_forever()
|
||||
try:
|
||||
async with self.server:
|
||||
await self.server.serve_forever()
|
||||
except asyncio.CancelledError:
|
||||
self.server.close()
|
||||
await self.server.wait_closed()
|
||||
|
||||
@@ -2,6 +2,7 @@ import logging
|
||||
import time
|
||||
import traceback
|
||||
import websockets
|
||||
import asyncio
|
||||
from common.proto_web import WebProto
|
||||
from oneme.processors import Processors
|
||||
from common.rate_limiter import RateLimiter
|
||||
@@ -319,7 +320,8 @@ class OnemeWS:
|
||||
"writer": websocket,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "oneme"
|
||||
"protocol": "oneme",
|
||||
"type": "web"
|
||||
}
|
||||
)
|
||||
else:
|
||||
@@ -333,7 +335,8 @@ class OnemeWS:
|
||||
"writer": websocket,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "oneme"
|
||||
"protocol": "oneme",
|
||||
"type": "web"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -410,4 +413,9 @@ class OnemeWS:
|
||||
|
||||
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
|
||||
@@ -3,10 +3,103 @@ from tamtam.socket import TamTamMobile
|
||||
from tamtam.websocket import TamTamWS
|
||||
from classes.controllerbase import ControllerBase
|
||||
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):
|
||||
def __init__(self):
|
||||
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):
|
||||
async def _start_all():
|
||||
|
||||
@@ -199,7 +199,8 @@ class TamTamMobile:
|
||||
"writer": writer,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "tamtam"
|
||||
"protocol": "tamtam",
|
||||
"type": "tcp"
|
||||
}
|
||||
)
|
||||
else:
|
||||
@@ -211,7 +212,8 @@ class TamTamMobile:
|
||||
"writer": writer,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "tamtam"
|
||||
"protocol": "tamtam",
|
||||
"type": "tcp"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -239,5 +241,9 @@ class TamTamMobile:
|
||||
|
||||
self.logger.info(f"Сокет запущен на порту {self.port}")
|
||||
|
||||
async with self.server:
|
||||
await self.server.serve_forever()
|
||||
try:
|
||||
async with self.server:
|
||||
await self.server.serve_forever()
|
||||
except asyncio.CancelledError:
|
||||
self.server.close()
|
||||
await self.server.wait_closed()
|
||||
@@ -1,6 +1,7 @@
|
||||
import logging
|
||||
import traceback
|
||||
import websockets
|
||||
import asyncio
|
||||
from common.proto_web import WebProto
|
||||
from tamtam.processors import Processors
|
||||
from common.rate_limiter import RateLimiter
|
||||
@@ -186,7 +187,8 @@ class TamTamWS:
|
||||
"writer": websocket,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "tamtam"
|
||||
"protocol": "tamtam",
|
||||
"type": "web"
|
||||
}
|
||||
)
|
||||
else:
|
||||
@@ -198,7 +200,8 @@ class TamTamWS:
|
||||
"writer": websocket,
|
||||
"ip": addr[0],
|
||||
"port": addr[1],
|
||||
"protocol": "tamtam"
|
||||
"protocol": "tamtam",
|
||||
"type": "web"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -229,4 +232,9 @@ class TamTamWS:
|
||||
|
||||
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
|
||||
@@ -83,6 +83,10 @@ class TelegramBot:
|
||||
updatetime = str(int(time.time() * 1000))
|
||||
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:
|
||||
# Создаем юзера
|
||||
await cursor.execute(
|
||||
@@ -90,9 +94,9 @@ class TelegramBot:
|
||||
(
|
||||
new_phone, # phone
|
||||
tg_id, # telegram_id
|
||||
message.from_user.first_name[:59], # firstname
|
||||
(message.from_user.last_name or "")[:59], # lastname
|
||||
(message.from_user.username or "")[:60], # username
|
||||
firstname, # firstname
|
||||
lastname, # lastname
|
||||
username, # username
|
||||
json.dumps([]), # profileoptions
|
||||
json.dumps(["TT", "ONEME"]), # options
|
||||
0, # accountstatus
|
||||
@@ -131,7 +135,7 @@ class TelegramBot:
|
||||
async def start(self):
|
||||
if self.enabled:
|
||||
try:
|
||||
await self.dp.start_polling(self.bot)
|
||||
await self.dp.start_polling(self.bot, handle_signals=False)
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка запуска Telegram бота: {e}")
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user