No Description

app.py 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from matrix_client.client import MatrixClient
  2. import requests
  3. import json
  4. import discord
  5. import re
  6. from config import *
  7. matrix_client = MatrixClient(matrix_homeserver, token=matrix_token, user_id=matrix_user_id)
  8. discord_client = discord.Client()
  9. matrix_room = matrix_client.join_room(matrix_room_id)
  10. matrix_file_types = ('m.file', 'm.image', 'm.video', 'm.audio')
  11. @discord_client.event
  12. async def on_message(message):
  13. if message.author.discriminator == "0000": return
  14. username = message.author.display_name[:1] + "\u200B" + message.author.display_name[1:]
  15. attachments = "\n".join([x.url for x in message.attachments])
  16. matrix_room.send_text("<{}> {}".format(username, message.clean_content + ("\n" + attachments if attachments != "" else "")))
  17. def send_webhook(username, avatar_url, content):
  18. data = {'username': username, 'content': content}
  19. if avatar_url: data['avatar_url'] = avatar_url
  20. headers = {'Content-type': 'application/json'}
  21. r = requests.post(webhook_url, data = json.dumps(data), headers=headers)
  22. def prepare_discord_content(content):
  23. content = content.replace("@everyone", "@\u200Beveryone")
  24. content = content.replace("@here", "@\u200Bhere")
  25. mentions = re.findall("(^|\s)(@(\w*))", content)
  26. guild = discord_client.get_channel(discord_channel).guild
  27. for mention in mentions:
  28. member = guild.get_member_named(mention[2])
  29. if not member: continue
  30. content = content.replace(mention[1], member.mention)
  31. return content
  32. def on_matrix_message(room, event):
  33. user = matrix_client.get_user(event['sender'])
  34. if event['type'] == "m.room.message" and not user.user_id == matrix_user_id:
  35. if event['content']['msgtype'] == "m.text":
  36. username = "[Matrix] {}".format(user.get_display_name())
  37. avatar = user.get_avatar_url()
  38. content = prepare_discord_content(event['content']['body'])
  39. send_webhook(username, avatar, content)
  40. if event['content']['msgtype'] in matrix_file_types:
  41. username = "[Matrix] {}".format(user.get_display_name())
  42. avatar = user.get_avatar_url()
  43. content = matrix_homeserver + "/_matrix/media/v1/download/" + event['content']['url'][6:]
  44. send_webhook(username, avatar, content)
  45. matrix_room.add_listener(on_matrix_message)
  46. matrix_client.start_listener_thread()
  47. discord_client.run(discord_token)