92 lines
2.9 KiB
Python
Executable File
92 lines
2.9 KiB
Python
Executable File
import json
|
|
import socket
|
|
|
|
class Bot:
|
|
def __init__(self, server, port, botnick, channels):
|
|
self.ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.server = server
|
|
self.port = port
|
|
self.botnick = botnick
|
|
self.channels = channels
|
|
self.running = True
|
|
|
|
self.recv_size = 2048
|
|
|
|
def send(self, message, *args):
|
|
response = message.format(*args) + "\n"
|
|
print("DEBUG: ", response)
|
|
self.ircsock.send(response.encode())
|
|
|
|
def send_message(target, message, *args):
|
|
msg = message.format(*args)
|
|
response = "PRIVMSG {0} :{1}".format(target, msg) + "\n"
|
|
print("DEBUG: ", response)
|
|
ircsock.send(response.encode())
|
|
|
|
def join(self, chan, confirmed=False):
|
|
self.send("JOIN {}", chan)
|
|
|
|
message = ""
|
|
magic_string = "End of /NAMES list."
|
|
while magic_string not in message:
|
|
message = self.ircsock.recv(self.recv_size).decode()
|
|
message = message.strip("\n\r")
|
|
print(message)
|
|
|
|
def ping(self, message):
|
|
response = message.split("PING :")[1]
|
|
self.send("PONG :{0}", response)
|
|
|
|
def parse(self, message):
|
|
before, after = message.split("PRIVMSG ", 1)
|
|
name = before.split("!", 1)[0][1:]
|
|
source, response = after.split(" :", 1)
|
|
return name, source, response
|
|
|
|
def load_settings(self, location):
|
|
with open(location, "r") as f:
|
|
self.settings = json.loads(f.read())
|
|
|
|
def start(self, callback, settings):
|
|
message = ""
|
|
registered = False
|
|
confirmed = True
|
|
|
|
self.ircsock.connect((self.server, self.port))
|
|
self.send("USER {0} {0} {0} {0}", self.botnick)
|
|
self.send("NICK {0}", self.botnick)
|
|
|
|
self.load_settings(settings)
|
|
|
|
password = self.settings["password"] or ""
|
|
confirm = self.settings["confirm"] or ""
|
|
email = self.settings["email"] or ""
|
|
|
|
magic_string = "MODE {} +r".format(self.botnick)
|
|
while magic_string not in message:
|
|
message = self.ircsock.recv(self.recv_size).decode()
|
|
message = message.strip("\n\r")
|
|
print(message)
|
|
if not registered and "Password accepted" in message:
|
|
registered = True
|
|
if not registered and "choose a different nick" in message:
|
|
self.send_message("NickServ", "IDENTIFY {}", password)
|
|
if not confirmed and "Your account will expire" i message:
|
|
self.send_message("NickServ", "CONFIRM {}", self.confirm)
|
|
confirmed = True
|
|
|
|
print("DEBUG: Joining")
|
|
|
|
for channel in self.channels:
|
|
self.join(channel)
|
|
|
|
print("DEBUG: Joined")
|
|
|
|
while self.running:
|
|
message = self.ircsock.recv(self.recv_size).decode("UTF-8")
|
|
message = message.strip('\n\r')
|
|
print(message)
|
|
|
|
callback()
|
|
|
|
# = #channel : |