first commit
[nanodesu.git] / ASCHE_0 / ASCHE_BOT / dcpp_client.py
blobb499f0352a062caafcf63f0763515e79ce257e47
1 import socket, select
3 ###############################################
4 # DCPP_CLIENT
5 ###############################################
6 class DCPP_CLIENT:
7 ST_DISCONNECTED = 0
8 ST_CONNECTED = 1
10 #---------------------------------------------#
11 # constructor
12 #---------------------------------------------#
13 def __init__(self, address, nick):
14 self.address = address
15 self.nick = nick
17 self.cache = ""
19 self.state = DCPP_CLIENT.ST_DISCONNECTED
20 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22 #---------------------------------------------#
23 # destructor
24 #---------------------------------------------#
25 def __del__(self):
26 self.disconnect()
28 #---------------------------------------------#
29 # connect
30 #---------------------------------------------#
31 def connect(self):
32 if self.is_connected(): return 0 # if already connected
34 try:
35 self.sock.connect(self.address)
36 self.state = DCPP_CLIENT.ST_CONNECTED
37 except:
38 return 0
40 #self.recv()
41 # TODO: process this!
43 key = create_key(u"EXTENDEDPROTOCOL_verlihub").encode("utf-8")
44 self.send("$Key %s|$ValidateNick %s|" %(key, self.nick))
45 #self.recv()
46 # TODO: process this!
48 self.send("$Version 1,0091|$MyINFO $ALL %s desu$ $0$$0$|" %self.nick)
50 return 1
52 #---------------------------------------------#
53 # disconnect
54 #---------------------------------------------#
55 def disconnect(self):
56 if not self.is_connected(): return 0 # if already disconnected
58 self.sock.close()
59 self.state = DCPP_CLIENT.ST_DISCONNECTED
61 #---------------------------------------------#
62 # is_connected
63 #---------------------------------------------#
64 def is_connected(self):
65 return (self.state == DCPP_CLIENT.ST_CONNECTED)
67 #---------------------------------------------#
68 # recv
69 #---------------------------------------------#
70 def recv(self):
71 if not self.is_connected(): return "" # if disconnected
73 inputready, outputready, exceptready = select.select([self.sock, ],[], [], 0.5)
74 if inputready:
75 try:
76 return self.sock.recv(1024)
77 except:
78 pass
79 return ""
80 # TODO: process this!
81 else:
82 return ""
84 #---------------------------------------------#
85 # update_cashe
86 #---------------------------------------------#
87 def update_cache(self):
88 self.cache += self.recv()
90 #---------------------------------------------#
91 # process_cashe
92 #---------------------------------------------#
93 def process_cache(self):
94 pipepos = self.cache.find("|")
96 if pipepos != -1:
97 data = self.cache[:pipepos]
98 self.cache = self.cache[pipepos+1:]
101 if data.find("$To:") != -1:
102 p1 = data.find("From: ") + 6
103 p2 = data.find(" $")
104 user = data[p1:p2]
106 p1 = data.find("> ") + 2
107 msg = data[p1:]
108 #MAIN
109 elif data.find("> ") != -1:
110 user = "#Main"
112 p1 = data.find("> ") + 2
113 msg = data[p1:]
114 #OTHER
115 else:
116 return None, None, None
118 return 1, user, msg
119 else:
120 return None, None, None
122 #---------------------------------------------#
123 # send
124 #---------------------------------------------#
125 def send(self, data):
126 if not self.is_connected(): return 0 # if disconnected
128 try:
129 self.sock.send(data)
130 except:
131 pass
132 # TODO: process this!
134 #---------------------------------------------#
135 # send_to_user
136 #---------------------------------------------#
137 def send_to_user(self, user, msg):
138 # PM
139 if user != "#Main":
140 self.send("$To: %s From: %s $<%s> %s|" %(user, self.nick, self.nick, msg))
141 # MAIN
142 else:
143 self.send("<%s> %s|" %(self.nick, msg))
145 ###############################################
146 # create_key
147 ###############################################
148 def create_key(lock):
149 key = {}
151 for i in xrange(1, len(lock)):
152 key[i] = ord(lock[i]) ^ ord(lock[i-1])
154 key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5
156 for i in xrange(0, len(lock)):
157 key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)
159 out = ''
160 for i in xrange(0, len(lock)):
161 out += unichr(key[i])
163 out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5', u'/%DCN005%/').replace(u'\44', u'/%DCN036%/')
164 out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174', u'/%DCN124%/').replace(u'\176', u'/%DCN126%/')
166 return out