diff --git a/bots.py b/bots.py new file mode 100644 index 00000000..bc8f42b7 --- /dev/null +++ b/bots.py @@ -0,0 +1,12 @@ +import multiprocessing +import telegrambot +import discordbot + +discord_users_pipe = multiprocessing.Pipe() + +discord = multiprocessing.Process(target=discordbot.process, args=(discord_users_pipe[0],)) +telegram = multiprocessing.Process(target=telegrambot.process, args=(discord_users_pipe[1],)) + +if __name__ == "__main__": + discord.start() + telegram.start() \ No newline at end of file diff --git a/discordbot.py b/discordbot.py index d5b93196..f631c0d3 100644 --- a/discordbot.py +++ b/discordbot.py @@ -6,6 +6,7 @@ import errors # Init the event loop import asyncio + loop = asyncio.get_event_loop() # Init the config reader @@ -13,30 +14,44 @@ import configparser config = configparser.ConfigParser() config.read("config.ini") -# Open a new postgres session -session = db.Session() - # Init the discord bot client = discord.Client() @client.event async def on_message(message: discord.Message): - if message.content.startswith("!register"): - try: - username = message.content.split(" ", 1)[1] - except IndexError: - await client.send_message(message.channel, "⚠️ Non hai specificato un username!") - return - try: - d = db.Discord.create(session, - royal_username=username, - discord_user=message.author) - except errors.AlreadyExistingError: - await client.send_message(message.channel, "⚠ Il tuo account Discord è già collegato a un account RYG o l'account RYG che hai specificato è già collegato a un account Discord.") - return - session.add(d) - session.commit() - await client.send_message(message.channel, "✅ Sincronizzazione completata!") + # Open a new postgres session + session = db.Session() + try: + if message.content.startswith("!register"): + try: + username = message.content.split(" ", 1)[1] + except IndexError: + await client.send_message(message.channel, "⚠️ Non hai specificato un username!") + return + try: + d = db.Discord.create(session, + royal_username=username, + discord_user=message.author) + except errors.AlreadyExistingError: + await client.send_message(message.channel, "⚠ Il tuo account Discord è già collegato a un account RYG o l'account RYG che hai specificato è già collegato a un account Discord.") + return + session.add(d) + session.commit() + await client.send_message(message.channel, "✅ Sincronizzazione completata!") + finally: + session.close() -client.run(config["Discord"]["bot_token"]) -session.close() \ No newline at end of file + +async def update_users_pipe(users_connection): + await client.wait_until_ready() + while True: + msg = await loop.run_in_executor(None, users_connection.recv) + if msg == "/cv": + discord_members = list(client.get_server(config["Discord"]["server_id"]).members) + users_connection.send(discord_members) + + +def process(users_connection): + print("Discordbot starting...") + loop.create_task(update_users_pipe(users_connection)) + client.run(config["Discord"]["bot_token"]) \ No newline at end of file diff --git a/telegrambot.py b/telegrambot.py index 669fcb20..9c03e9f0 100644 --- a/telegrambot.py +++ b/telegrambot.py @@ -2,12 +2,15 @@ import db import errors from telegram import Bot, Update, Message from telegram.ext import Updater, CommandHandler +from discord import Status as DiscordStatus # Init the config reader import configparser config = configparser.ConfigParser() config.read("config.ini") +users_connection = None + def cmd_register(bot: Bot, update: Update): session = db.Session() try: @@ -27,10 +30,55 @@ def cmd_register(bot: Bot, update: Update): bot.send_message(update.message.chat.id, "✅ Sincronizzazione completata!") session.close() -u = Updater(config["Telegram"]["bot_token"]) -u.dispatcher.add_handler(CommandHandler("register", cmd_register)) -u.start_polling() -try: - u.idle() -except KeyboardInterrupt: - pass \ No newline at end of file + +def cmd_discord(bot: Bot, update: Update): + users_connection.send("/cv") + server_members = users_connection.recv() + message = "" + for member in server_members: + if member.status == DiscordStatus.offline and member.voice.voice_channel is None: + continue + if member.bot: + continue + # Online status emoji + if member.status == DiscordStatus.online: + message += "🔵 " + elif member.status == DiscordStatus.idle: + message += "⚫️ " + elif member.status == DiscordStatus.dnd: + message += "🔴 " + elif member.status == DiscordStatus.offline: + message += "⚪️ " + # Nickname + if member.nick is not None: + message += member.nick + else: + message += member.name + # Voice + if member.voice.voice_channel is not None: + # Voice status + if member.voice.self_deaf: + message += f" | 🔇 {member.voice.voice_channel.name}" + elif member.voice.self_mute: + message += f" | 🔈 {member.voice.voice_channel.name}" + else: + message += f" | 🔊 {member.voice.voice_channel.name}" + # Game or stream + if member.game is not None: + if member.game.type == 0: + message += f" | 🎮 {member.game.name}" + elif member.game.type == 1: + message += f" | 📡 [{member.game.name}]({member.game.url})" + message += "\n" + bot.send_message(update.message.chat.id, message, disable_web_page_preview=True, parse_mode="Markdown") + + +def process(discord_users_connection): + print("Telegrambot starting...") + global users_connection + users_connection = discord_users_connection + u = Updater(config["Telegram"]["bot_token"]) + u.dispatcher.add_handler(CommandHandler("register", cmd_register)) + u.dispatcher.add_handler(CommandHandler("discord", cmd_discord)) + u.start_polling() + u.idle() \ No newline at end of file