import asyncio, json, traceback
import html.parser
import telegram
from telegram import Bot, Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters
from io import StringIO
TOKEN = "..."
TOKEN_TEST = "..."
class IrcBot:
async def connect(self, server, port):
self._reader, self._writer = await asyncio.open_connection(server, port)
self._send("USER tgbridge 0 * :tgbridge")
self._send("NICK tgbridge")
await self._recv()
self._send("CAP REQ :no-history")
await self._recv()
self._send("CAP END")
def _send(self, msg):
msg += "\r\n"
self._writer.write(msg.encode())
async def _recv(self):
message = await self._reader.readline()
message = message.decode()
return message.removesuffix("\r\n")
async def get_message(self):
while True:
line = await self._recv()
print(f"Received line: {line}")
tokens = line.split(" ")
if len(tokens) < 2 or tokens[1] != "PRIVMSG":
continue
assert tokens[0][0] == ":"
username = tokens[0].split("!")[0][1:]
channel = tokens[2]
message = ":".join(line.split(":")[2:])
return (username, channel, message)
class HTMLTextExtractor(html.parser.HTMLParser):
def __init__(self):
super(HTMLTextExtractor, self).__init__()
self.reset()
self.strict = False
self.convert_charrefs= True
self.text = StringIO()
def handle_data(self, d):
self.text.write(d)
def get_text(self):
return self.text.getvalue()
def html_to_text(html):
s = HTMLTextExtractor()
s.feed(html)
return s.get_text()
def append_log(channel, username, message):
with open(f"/srv/http/log/{channel}.txt", "a") as fd:
fd.write(f"<{username}> {message}\n")
with open(f"/srv/http/log/all.txt", "a") as fd:
fd.write(f"{channel} <{username}> {message}\n")
async def main():
irc = IrcBot()
await irc.connect("localhost", 6667)
while True:
nick, channel, message = await irc.get_message()
if message.lower() == "test":
continue
if nick == "testbot":
continue
# Strip all HTML tags
#message = html_to_text(message)
message = message.replace("<", "<")
message = message.replace(">", ">")
# Limit line lengths
message = message[:300]
# Left pad nickname
nick = nick.replace("<", "<")
nick = nick.replace(">", ">")
nick = nick.rjust(12)
# Limit line lengths
message = message[:300]
msg = f"{channel} {nick} | {message}"
append_log(channel, nick, message)
# Keep retrying until the fucker is sent
while True:
try:
async with Bot(TOKEN) as bot:
await bot.send_message("@darkfi_darkirc", msg,
parse_mode="HTML",
disable_notification=True,
disable_web_page_preview=True)
break
#except telegram.error.BadRequest:
# pass
except:
print(channel, msg)
print(traceback.format_exc())
await asyncio.sleep(3)
asyncio.run(main())