Skip to content

Commit e64a69a

Browse files
committed
progress
1 parent a8f2b62 commit e64a69a

File tree

2 files changed

+441
-0
lines changed

2 files changed

+441
-0
lines changed

irc.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import logging
2+
import asynchat
3+
import socket
4+
import struct
5+
import random
6+
7+
import base58
8+
9+
class BIRCSeeder(asynchat.async_chat):
10+
def __init__(self, addr):
11+
asynchat.async_chat.__init__(self)
12+
ip, port = addr.split(":")
13+
port = int(port)
14+
self.addr = (ip, port)
15+
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
16+
self.connect(self.addr)
17+
self.set_terminator("\r\n")
18+
self.reset_incoming_data()
19+
self.welcome()
20+
self.handlers = {
21+
"302" : self.recv_userhost,
22+
}
23+
24+
def welcome(self):
25+
nick = "x%s" % random.getrandbits(32)
26+
self.push_nick(nick)
27+
self.push_crlf("USER %s 8 * : %s", nick, nick)
28+
self.push_crlf("USERHOST %s", nick)
29+
30+
def push_crlf(self, msg, *args):
31+
msg += "\r\n"
32+
self.push(msg % args)
33+
34+
def push_nick(self, nick):
35+
self.push_crlf("NICK %s", nick)
36+
37+
def collect_incoming_data(self, data):
38+
self.incoming_data += data
39+
40+
def reset_incoming_data(self):
41+
self.incoming_data = ""
42+
43+
def handle_connect(self):
44+
logging.debug("connected to %s", self.addr)
45+
46+
def found_terminator(self):
47+
logging.debug("received packet (%s) %s", len(self.incoming_data), self.incoming_data.strip())
48+
parts = self.incoming_data.split(" ", 2)
49+
handler = self.handlers.get(parts[1], None)
50+
if callable(handler):
51+
handler(parts[2])
52+
self.reset_incoming_data()
53+
54+
def recv_userhost(self, data):
55+
at = data.find("@")
56+
ip = data[at+1:]
57+
logging.debug("found ip %s", ip)
58+
nick = "f" + self.encode_address(ip, 8333)
59+
logging.debug("nick %s", nick)
60+
self.push_nick(nick)
61+
self.push_crlf("JOIN #bitcoin")
62+
self.push_crlf("WHO #bitcoin")
63+
64+
def encode_address(self, ip, port):
65+
ip = socket.inet_aton(ip)
66+
port = struct.pack("!H", port)
67+
data = ip + port
68+
h = base58.checksum(data)
69+
data += h[:4]
70+
return base58.b58encode(data)
71+
72+
73+
74+
def decode_address(self, data):
75+

0 commit comments

Comments
 (0)