modular-bot-framework-for-t.../modules/irc-bridge/bot.py

123 lines
3.8 KiB
Python
Raw Permalink Normal View History

2023-02-25 15:53:35 +02:00
import time
import socket
import threading
login_lines_raw = [
"NICK bridge",
"USER bridge bridge * !",
"JOIN #io23-bridge"
]
login_lines = map( lambda x: (x + "\n").encode("utf-8"), login_lines_raw )
recv_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
send_buffer = []
reconnecting = False
LINE_END = "\r\n".encode("utf-8")
recv_s.bind( ("127.0.0.1", 5001) )
def reconnect():
global s, reconnecting
reconnecting = True
while True:
try:
s.close()
except:
pass
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect( ("10.1.1.1", 6667) )
for i in login_lines:
s.send(i)
time.sleep(0.5)
reconnecting = False
break
except Exception as e:
print(f"[reconnect:main] ERROR: got exception {e}")
t = time.time()
open("error.log", "a", encoding = "utf-8").write(f"[{t}] recv_thread:main ERROR: got exception {e}\n")
time.sleep(2)
def recv_thread():
global s, send_buffer, reconnecting
databuffer = bytes()
while True:
try:
new_data = s.recv(1024)
print(f"[DEBUG] new_data: {new_data}")
if len(new_data) == 0:
if not reconnecting:
reconnect() # bin the old socket and get a new one instead
continue
databuffer += new_data
if LINE_END in databuffer:
commands = map( lambda x: x.decode("UTF-8"), databuffer.split(LINE_END)[:-1])
for command in commands:
if len(command) > 0:
if command.split(" ")[0] == "PING":
print("[DEBUG] recv_thread:command:ping: Responding with {}".format(command.split(" ")[1]).encode("UTF-8"))
send_buffer.append(("PONG {}\n".format( command.split(" ")[1]).encode("UTF-8") ))
else:
pass
databuffer = databuffer.split(LINE_END)[-1]
except Exception as e:
print(f"[recv_thread:main] ERROR: got exception {e}")
t = time.time()
open("error.log", "a", encoding = "utf-8").write(f"[{t}] recv_thread:main ERROR: got exception {e}\n")
try:
if not reconnecting:
reconnect()
except Exception as e:
print(f"[recv_thread:except:reconnect] ERROR: got exception {e}")
t = time.time()
open("error.log", "a", encoding = "utf-8").write(f"[{t}] recv_thread:except:reconnect ERROR: got exception {e}\n")
def send_thread():
global s, send_buffer, reconnecting
while True:
if len(send_buffer) > 0:
try:
print(f"[DEBUG] send_thread: sending {send_buffer[0]}")
s.send(send_buffer[0])
del send_buffer[0]
except Exception as e:
print(f"[send_thread:main] ERROR: got exception {e}")
t = time.time()
open("error.log", "a", encoding = "utf-8").write(f"[{t}] send_thread:main ERROR: got exception {e}\n")
if not reconnecting:
reconnect()
time.sleep(0.2)
else:
time.sleep(3)
def msg_thread():
global recv_s, send_buffer
while True:
d = recv_s.recvfrom(16384)
print(f"[DEBUG] msg_thread:d: {d}")
send_buffer.append(d[0])
st = threading.Thread(target = send_thread, args = [])
rt = threading.Thread(target = recv_thread, args = [])
mt = threading.Thread(target = msg_thread, args = [])
reconnect()
st.start()
rt.start()
mt.start()