import os import logging logging.basicConfig( format='[%(asctime)s] %(levelname)s %(module)s/%(funcName)s - %(message)s', level=logging.DEBUG if os.environ.get('DEBUG') else logging.INFO) import settings import asyncio import json import requests from datetime import datetime from uuid import uuid4 from telethon import TelegramClient, events from aiohttp import web bot = TelegramClient('data/bot', settings.API_ID, settings.API_HASH).start(bot_token=settings.API_TOKEN) TANNER = 79316791 messages = {} def controller_message(message): payload = dict(misc=message) r = requests.post('https://tbot.tannercollin.com/message', data=payload, timeout=10) if r.status_code == 200: return True else: logging.exception('Unable to communicate with controller! Message: ' + message) return False @bot.on(events.NewMessage(incoming=True)) async def new_message(event): text = event.raw_text sender = event.sender_id logging.info('{} {}'.format(sender, text)) if sender != TANNER: return if not text.startswith('/allow_'): return mid = text.replace('/allow_', '') try: data = messages[mid] except KeyError: await event.reply('Message ID not found. Did the bot restart?') return entry = '\n\n{} - {}'.format(data['date'], data['name']) website = data['website'] if website: prefixes = ['http://', 'https://', 'gemini://', 'gopher://'] for prefix in prefixes: if website.lower().startswith(prefix): break else: # for loop website = 'http://' + website entry += ' ({0})'.format(website) entry += '\n\n{}\n\n------------------------------------------------------------'.format(data['message']) with open('data/g/index.html', 'r') as f: page = f.read() with open('data/g/index.html', 'w') as f: header, entries = page.split('===========', maxsplit=1) f.write(header) f.write('===========') f.write(entry) f.write(entries) await event.reply('Entry added to t0.vc/g') logging.info('Added: {}'.format(data)) async def message_tanner(name, website, message, captcha, mid): if 'tanner' not in captcha.lower(): return if name.replace(' ', '') in ['website', 'webpage', 'homepage']: return report = 'Name: {}\n\nWebsite: {}\n\nMessage: {}\n\n/allow_{}' try: await bot.send_message(TANNER, message=report.format(name, website, message, mid)) except: logging.error('Problem sending bot message.') controller_message('t0sig: problem sending bot message!') exit() async def submit(request): data = dict(await request.post()) data['date'] = str(datetime.today().date()) mid = str(uuid4()).split('-')[0] logging.info('{} {}'.format(mid, data)) try: fake_username = data.get('fake_username', '') # not used yet name = data['name'] website = data.get('website', '') message = data['message'] captcha = data.get('captcha', '') except KeyError: raise web.HTTPBadRequest(reason='You are missing something.') if not len(name) or not len(message): raise web.HTTPBadRequest(reason='You are missing something.') if len(name) > 50: raise web.HTTPBadRequest(reason='Name is too long.') if len(website) > 100: raise web.HTTPBadRequest(reason='Website is too long.') if len(message) > 1000: raise web.HTTPBadRequest(reason='Message is too long.') await message_tanner(name, website, message, captcha, mid) messages[mid] = data with open('data/messages.log', 'a') as f: f.write(json.dumps(data)+'\n') return web.Response(text='Thanks! Your message is pending approval.') if __name__ == '__main__': bot.start() app = web.Application() app.router.add_post('/', submit) web.run_app(app, port=8123)