import aiohttp import asyncio import hashlib import logging import re import settings from telethon import TelegramClient, events bot = TelegramClient('data/bot', settings.API_ID, settings.API_HASH).start(bot_token=settings.API_TOKEN) web = None api = lambda route: settings.DYNMAP_ADDRESS + route md5 = lambda name: int(hashlib.md5(name.encode()).hexdigest(), 16) emojis = list('๐ŸŒน๐Ÿต๐ŸŒป๐ŸŒผ๐Ÿ€๐Ÿž๐ŸŒŠโ›„๏ธโ„๏ธ๐Ÿ”๐ŸŒก๐Ÿ”ฅ๐Ÿœโ˜€๏ธ๐Ÿ’งโ˜”๏ธโšก๏ธ๐ŸŒˆโญ๏ธ๐ŸŒ๐ŸŒ™๐Ÿช๐Ÿต๐Ÿฆ๐Ÿฏ๐Ÿฑ๐Ÿถ๐Ÿบ๐Ÿป๐Ÿผ๐Ÿน๐Ÿฐ๐ŸฆŠ๐Ÿฆ๐Ÿฆ“๐Ÿฆ„๐Ÿธ๐Ÿข๐Ÿ•๐Ÿ†๐Ÿ๐Ÿฆฅ๐Ÿ˜๐Ÿฆ๐Ÿฆ’๐Ÿฆ๐Ÿช๐Ÿฆฆ๐Ÿ”๐Ÿค๐Ÿฆ‰๐Ÿฆœ๐Ÿฆข๐Ÿฆฉ๐Ÿง๐Ÿฌ๐Ÿ ๐Ÿก๐Ÿฆ๐Ÿ™๐Ÿ•ท๐ŸŒ๐Ÿž๐Ÿฆ‹๐Ÿ“๐Ÿ’๐ŸŽ๐Ÿ‰๐Ÿ๐ŸŒ๐Ÿ‹๐Ÿ๐Ÿฅ๐Ÿ‡๐Ÿฅฅ๐Ÿ…๐ŸŒถ๐Ÿ„๐Ÿฅ•๐Ÿง…๐ŸŒฝ๐Ÿฅฆ๐Ÿฅ‘๐Ÿž๐Ÿฅž๐Ÿง‡๐Ÿง€๐Ÿฅ“๐Ÿ”๐ŸŒญ๐Ÿฅช๐Ÿฅจ๐ŸŸ๐Ÿ•๐ŸŒฎ๐Ÿฅ™๐Ÿœ๐Ÿฃ๐Ÿญ๐Ÿฉ๐Ÿช๐Ÿฏ๐Ÿฟ๐Ÿบ๐Ÿท๐Ÿ›น๐Ÿš€๐Ÿ›ธ๐Ÿ›ฉ๐ŸŽ‰๐ŸŽˆ๐ŸŽ€๐ŸŽโšพ๏ธ๐Ÿ€๐Ÿ๐Ÿˆ๐ŸŽฏ๐ŸŽน๐ŸŽท๐ŸŽบ๐ŸŽธ๐Ÿ’ต๐Ÿ’ฐ๐Ÿ’ก๐Ÿ’Ž๐ŸŸฅ๐ŸŸง๐ŸŸจ๐ŸŸฉ๐ŸŸฆ๐ŸŸช') logging.basicConfig(level=logging.INFO) logging.info('Loaded {} emojis'.format(len(emojis))) logging.info('Bridge initialized') @bot.on(events.NewMessage(incoming=True)) async def new_message(event): text = event.raw_text sender = await event.get_sender() reply_name = '' if event.chat.id != settings.CHAT_ID: logging.info('Wrong chat ID') return if not text: logging.info('No text found') return if event.message.is_reply: reply_msg = await event.get_reply_message() reply_text = reply_msg.text reply_name = reply_msg.sender.first_name if reply_name == 'protospace_mc_bot': match = re.search(r'<(\w+)>.*', reply_text) if match: reply_name, = match.groups() else: reply_name = '' if reply_name: reply_name = settings.CUSTOM_NAMES.get(reply_name, reply_name) text = reply_name + ': ' + text name = re.sub(r'\W+', '', sender.first_name) name = '[TG] ' + settings.CUSTOM_NAMES.get(name, name) logging.info('[SEND] {}: {}'.format(name, text)) data = dict(name=name, message=text) try: await web.post(api('/up/sendmessage'), json=data) except aiohttp.ClientError: logging.exception('Problem sending message to dynmap:') async def main(): global web web = aiohttp.ClientSession() last_time = 0 last_msg = '' logging.info('Bridge loaded') while True: try: async with web.get(api('/up/world/world/' + str(last_time))) as res: j = await res.json(content_type='text/plain;charset=utf-8') last_time = j['timestamp'] for update in j['updates']: if update['type'] != 'chat': continue if update['playerName'].startswith('[TG] '): continue name = update['playerName'] icon = emojis[md5(name) % len(emojis)] icon = settings.CUSTOM_EMOJIS.get(name, icon) message = '{} <{}> {}'.format(icon, name, update['message']) if message == last_msg: continue logging.info('[RECV] ' + message) await bot.send_message(settings.CHAT_ID, message) last_msg = message except aiohttp.ClientError: logging.exception('Problem getting message from dynmap:') await asyncio.sleep(1) with bot: bot.loop.run_until_complete(main())