Advertisement
Guest User

Untitled

a guest
Oct 15th, 2017
2,375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.85 KB | None | 0 0
  1. """ Connects discord with skype as a relay """
  2.  
  3. # Import Built-Ins
  4. import asyncio
  5. import logging
  6. import sys
  7. import threading
  8. import time
  9. from html import unescape
  10.  
  11. # Import Third-Party
  12. import discord
  13. from daemonize import Daemonize
  14. from raven import Client
  15. from raven.conf import setup_logging
  16. from raven.handlers.logging import SentryHandler
  17. from skpy import Skype, SkypeNewMessageEvent, SkypeEventLoop, SkypeMsg
  18. from telegram.ext import Updater, MessageHandler, Filters
  19.  
  20. # Discord
  21. admins = ["urbano#9519", "wojtekj#2564"]
  22. discord_message_list = []
  23. bots = ["Skype-bot#0724", "wojtekjBOT#2057", "RektBOT#1742", "DiscordBOT#3372"]
  24. discord_write_channel = discord.Object(id='290573398961291264')  # Production
  25. login_token = 'MzQ3MzYxNzU1NzUzODczNDA5.DHXR2g.N1-pjOsSWYUPL2OW9_xuMhdH9oU'  # Production
  26.  
  27.  
  28. # Skype
  29. skype_username = "discord-bot-123@protonmail.com"
  30. skype_password = "CHOCHObtcMOON2.."
  31. skype_group_url = "https://join.skype.com/nKBBN8kaFXb7"  # production
  32. skype_group2_url = "https://join.skype.com/pbuuJZjtGHlV"  # production
  33. skype_write_channel1 = "19:I2RraW5ndHVybmVyLyRtYXJ0aW4ubnlnYXJkMjthYjM1YjU5Yzk5MjI0Y2Q3@p2p.thread.skype"  # production
  34. skype_write_channel2 = "19:bf64973ecb634ffdbc948132818a2c9e@thread.skype"  # production
  35. skype_online = False
  36. skype_message_list = []
  37.  
  38. # Telegram
  39. TELEGRAM_TOKEN = '474466581:AAF2e6jva-D20JkB8YDdH3-JW7grz7VWbt8'
  40. telegram_write_channel = ""
  41.  
  42. TelegramUpdater = Updater(token=TELEGRAM_TOKEN)
  43.  
  44.  
  45. # Raven
  46. client = Client("https://6276ca312fc74bb1a0258a6c70785ef5:0f221a6657e64923a63fdd3ad955cb2a@sentry.io/217820")
  47. handler = SentryHandler(client)
  48. handler.setLevel(logging.ERROR)
  49. setup_logging(handler)
  50. logger = logging.getLogger(__name__)
  51.  
  52.  
  53. def is_gif(message):
  54.     return bool([gif for gif in [".gif", "giphy.com"] if gif in message])
  55.  
  56.  
  57. def format_tags(message):
  58.     # 1 find number of tags
  59.     tags_a = message.count('<')
  60.     tags_b = message.count('>')
  61.  
  62.     n = min([tags_a, tags_b])
  63.  
  64.     if "<quote author=" in message:
  65.         # Parsing skype quote
  66.         message = message.replace('<<<', '')
  67.  
  68.         tabs = []
  69.         for n in range(n):
  70.             try:
  71.                 txt = message.split("<")[n].split(">")[0]
  72.             except KeyError:
  73.                 logger.error("Error solving quotes", exc_info=True)
  74.             else:
  75.                 tabs.append(txt)
  76.  
  77.         for tab in tabs:
  78.             message = message.replace(tab, "")
  79.  
  80.         message = message.replace("<", "").replace(">", "").replace("quote", "").replace("//", "")
  81.  
  82.     message = message.replace("</b>", "*")
  83.  
  84.     return message
  85.  
  86.  
  87. def push(platform, user, message, channel="both"):
  88.     if platform == "skype" and skype_online:
  89.         global discord_message_list
  90.         message = message.replace("`", "")
  91.         discord_message_list.append([user.split("#")[0], message, channel])
  92.         x.write_message()
  93.  
  94.         return True
  95.  
  96.     elif platform == "discord":
  97.         global skype_message_list
  98.         message = unescape(message)
  99.         message = format_tags(message)
  100.  
  101.         if not message.strip():
  102.             logger.warning("No message after parsing")
  103.             return True
  104.  
  105.         t = user + ": " + message
  106.         text = "```LDIF\n" + t + "\n```"
  107.         skype_message_list.append(text)
  108.  
  109.         return True
  110.  
  111.     elif platform == "telegram":
  112.         TelegramUpdater.bot.send_message(chat_id=telegram_write_channel, text=user + ": " + message)
  113.  
  114.  
  115. class DiscordBot(discord.Client):
  116.     async def on_message(self, message):
  117.         if not str(message.author) in bots:
  118.  
  119.             if message.content.startswith('!stick'):
  120.                 if str(message.author) in admins:
  121.                     global discord_write_channel
  122.                     discord_write_channel = message.channel
  123.  
  124.             else:
  125.                 if not message.content.startswith('!'):
  126.                     if str(message.channel) == "general":
  127.                         push("skype", str(message.author), str(message.clean_content))
  128.                         push("telegram", str(message.author), str(message.clean_content))
  129.                     else:
  130.                         logger.error("Wrong channel!", extra={"stack": True})
  131.  
  132.     async def on_ready(self):
  133.         logger.info("Discord ok")
  134.  
  135.  
  136. async def new_mesage():
  137.     await asyncio.sleep(5)
  138.     while not discord_bot.is_closed:
  139.         global skype_message_list
  140.         if skype_message_list:
  141.             message = skype_message_list.pop(0)
  142.             if message:
  143.                 logger.info("Sending Discord: " + message)
  144.                 await discord_bot.send_message(discord_write_channel, message)
  145.  
  146.         await asyncio.sleep(0.15)
  147.  
  148.  
  149. class SkypeBot(SkypeEventLoop):
  150.     def __init__(self):
  151.         super(SkypeBot, self).__init__(skype_username, skype_password)
  152.         self.skype = Skype(skype_username, skype_password)
  153.  
  154.         global skype_write_channel1
  155.         global skype_write_channel2
  156.  
  157.         skype_write_channel1 = self.chats.urlToIds(skype_group_url).get('id')
  158.         skype_write_channel2 = self.chats.urlToIds(skype_group2_url).get('id')
  159.  
  160.         global skype_online
  161.         skype_online = True
  162.  
  163.     def write_message(self):
  164.         global discord_message_list
  165.         message = discord_message_list.pop(0)
  166.         channel = message[2]
  167.         user_name = message[0]
  168.  
  169.         if not user_name:
  170.             user_name = "Ghost"  # Hotfix
  171.  
  172.         message = SkypeMsg.bold(user_name) + ": " + message[1]
  173.  
  174.         if channel == "both":  # Sent from discord
  175.             self.chat_group = self.chats.chat(skype_write_channel1)
  176.             self.chat_group.sendMsg(message, rich=True)
  177.             self.chat_group = self.chats.chat(skype_write_channel2)
  178.             self.chat_group.sendMsg(message, rich=True)
  179.  
  180.         else:
  181.             logger.warning("Wrong channel", extra={"stack": True})
  182.  
  183.     def onEvent(self, event):
  184.         if not isinstance(event, SkypeNewMessageEvent):
  185.             return None
  186.  
  187.         msg = {
  188.             "skype_username": self.contacts[event.msg.userId].name,
  189.             "message_string": event.msg.plain
  190.         }
  191.  
  192.         if event.msg.userId != self.userId and event.msg.userId != "live:skype-bot-123" and not event.msg.content.startswith("!"):
  193.             channel = str(event.msg.chatId)
  194.  
  195.             if channel == skype_write_channel1 or channel == skype_write_channel2:
  196.                 push("discord", str(msg["skype_username"]), str(msg["message_string"]), channel)
  197.                 push("telegram", str(msg["skype_username"]), str(msg["message_string"]), channel)
  198.  
  199.             else:
  200.                 logger.warning("I'm getting stalked", extra={'stack': True})
  201.  
  202.  
  203. x = ""
  204. skype_state = True
  205.  
  206.  
  207. def start_skype():
  208.     while skype_state:
  209.         logger.info("Starting Thread")
  210.         global x
  211.         x = SkypeBot()  # Starts bot in skype
  212.         t = threading.Thread(target=x.loop)  # Loop message
  213.         t.start()
  214.  
  215.         while t.isAlive():
  216.             time.sleep(1)
  217.  
  218.         logger.warning("Skype Dead from inside", exc_info=True)
  219.  
  220.  
  221. discord_bot = DiscordBot()
  222.  
  223.  
  224. def push_from_telegram(bot, update):
  225.     """
  226.    Listens telegram updates via dispatcher.add_handler
  227.    All Telegram updates hits that function.
  228.    """
  229.     username = update.message.from_user.username
  230.     message = update.message.text
  231.  
  232.     # To discord
  233.     push("discord", username, message)
  234.  
  235.     # To skype
  236.     push("skype", username, message)
  237.  
  238.  
  239. def telegram_listener():
  240.     """
  241.    Starts Telegram bot, and it stays there.
  242.    Better to use in a thread.
  243.    """
  244.     # Init
  245.     dispatcher = TelegramUpdater.dispatcher
  246.  
  247.     # Setup listener
  248.     echo_handler = MessageHandler(Filters.text | Filters.photo, push_from_telegram)
  249.     dispatcher.add_handler(echo_handler)
  250.  
  251.     # Start listener
  252.     TelegramUpdater.start_webhook(listen='127.0.0.1', port=5000, url_path=TELEGRAM_TOKEN)
  253.     TelegramUpdater.bot.set_webhook(url='https://pyderman.com/' + TELEGRAM_TOKEN)
  254.     TelegramUpdater.idle()
  255.  
  256.  
  257. class RelayBot:
  258.     def __init__(self):
  259.         self.run()
  260.  
  261.     def run(self):
  262.         skype_thread = threading.Thread(target=start_skype)
  263.         skype_thread.start()
  264.  
  265.         telegram_thread = threading.Thread(target=telegram_listener)
  266.         telegram_thread.start()
  267.  
  268.         try:
  269.             discord_bot.loop.create_task(new_mesage())
  270.             discord_bot.loop.run_until_complete(discord_bot.start(login_token))
  271.  
  272.         except Exception as e:
  273.             logger.error(str(e), exc_info=True)
  274.             discord_bot.loop.run_until_complete(discord_bot.logout())
  275.             pending = asyncio.Task.all_tasks()
  276.             gathered = asyncio.gather(*pending)
  277.  
  278.             gathered.cancel()
  279.             discord_bot.loop.run_forever()
  280.             gathered.exception()
  281.  
  282.         sys.exit(0)
  283.  
  284.  
  285. worker = RelayBot()
  286.  
  287. pid = "/tmp/discord_relay.pid"
  288. daemon = Daemonize(app="discord_relay", pid=pid, action=worker)
  289. daemon.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement