11 username = "plomlombot"
16 def __init__(self, server, port):
17 self.socket = socket.socket()
18 self.socket.connect((server, port))
19 self.socket.setblocking(0)
22 self.last_pong = time.time()
24 if self.last_pong + timeout < time.time():
25 raise RuntimeError("server not answering")
26 self.send_line("PING " + nickname + " " + servername)
27 def send_line(self, msg_orig):
28 msg = msg_orig + "\r\n"
31 while total_sent_len < msg_len:
32 sent_len = self.socket.send(bytes(msg[total_sent_len:], "UTF-8"))
34 raise RuntimeError("socket connection broken")
35 total_sent_len += sent_len
36 print("LINE TO SERVER: "
37 + str(datetime.datetime.now()) + ": " + msg_orig)
38 def recv_line_wrapped(self):
39 if len(self.line_buffer) > 0:
40 return self.line_buffer.pop(0)
42 ready = select.select([self.socket], [], [], int(timeout / 2))
46 self.last_pong = time.time()
47 received_runes = self.socket.recv(1024).decode("UTF-8")
48 if len(received_runes) == 0:
49 raise RuntimeError("socket connection broken")
50 self.rune_buffer += received_runes
51 lines_split = str.split(self.rune_buffer, "\r\n")
52 self.line_buffer += lines_split[:-1]
53 self.rune_buffer = lines_split[-1]
54 if len(self.line_buffer) > 0:
55 return self.line_buffer.pop(0)
57 line = self.recv_line_wrapped()
59 print("LINE FROM SERVER " + str(datetime.datetime.now()) + ": " +
63 io = IO("irc.freenode.net", 6667)
64 io.send_line("NICK " + nickname)
65 io.send_line("USER " + username + " 0 * : ")
66 io.send_line("JOIN " + channel)
67 servername = io.recv_line().split(" ")[0][1:]
72 tokens = line.split(" ")
74 if tokens[1] == "PRIVMSG":
76 for rune in tokens[0]:
82 for rune in tokens[2]:
88 if receiver != nickname:
90 msg = str.join(" ", tokens[3:])[1:]
91 matches = re.findall("(https?://[^\s]+)", msg)
92 for i in range(len(matches)):
94 webpage = urllib.request.urlopen(url)
95 charset = webpage.info().get_content_charset()
96 content = webpage.read().decode(charset)
97 title = str(content).split('<title>')[1].split('</title>')[0]
98 title = html.unescape(title)
99 io.send_line("PRIVMSG "
100 + target + " :page title for url: " + title)
101 if tokens[0] == "PING":
102 io.send_line("PONG " + tokens[1])