· 8 years ago · Nov 21, 2017, 03:46 PM
1import socket,sqlite3,tkinter,time
2from multiprocessing import Process, Queue
3
4
5def add_nulls(dlen,data):
6 to_ret = data
7 if(len(data)<dlen):
8 dif = dlen-len(data)
9 to_ret = "0"*dif+to_ret
10 return to_ret
11
12class settings:
13 def __init__(self):
14 connection = sqlite3.connect("conf.db")
15 cur = connection.cursor()
16 cur.execute('''
17 CREATE TABLE IF NOT EXISTS config(
18 NAME TEXT,
19 VALUE TEXT)
20 ''')
21 cur.execute('''
22 CREATE TABLE IF NOT EXISTS servers(
23 ID INTEGER PRIMARY KEY,
24 NAME TEXT,
25 ADDR TEXT,
26 PORT TEXT,
27 LOGIN TEXT,
28 PASSWORD TEXT)
29 ''')
30 connection.commit()
31 connection.close()
32
33 def get_setting(self,sname):
34 connection = sqlite3.connect("conf.db")
35 cur = connection.cursor()
36 cur.execute("SELECT VALUE FROM config WHERE NAME = ?",(sname,))
37 result = cur.fetchone()
38 connection.close()
39 return(result)
40
41 def set_setting(self,sname,value):
42 connection = sqlite3.connect("conf.db")
43 cur = connection.cursor()
44 cur.execute("INSERT INTO config VALUES(?,?)",(sname,value))
45 connection.close()
46
47 def save_server(self,sname,addr,port,login,pwd):
48 connection = sqlite3.connect("conf.db")
49 cur = connection.cursor()
50 cur.execute("REPLACE INTO servers VALUES(NULL,?,?,?,?,?)",(sname,addr,port,login,pwd))
51 connection.commit()
52 connection.close()
53
54 def get_all_servers(self):
55 connection = sqlite3.connect("conf.db")
56 cur = connection.cursor()
57 cur.execute("SELECT * FROM servers")
58 result = cur.fetchall()
59 connection.close()
60 return(result)
61
62class history:
63 def make_tname(self,cID,sID):
64 tname = "chat"
65 tname+=add_nulls(8,str(cID))
66 tname+=add_nulls(8,str(sID))
67 return(tname)
68
69 def add_msg(self,cID,sID,sender,message):
70 tname = self.make_tname(cID,sID)
71 connection = sqlite3.connect("chats.db")
72 cur = connection.cursor()
73 cur.execute('''
74 CREATE TABLE IF NOT EXISTS '''+tname+'''(
75 SENDER INTEGER,
76 MESSAGE BLOB)
77 ''')
78 connection.commit()
79 cur.execute("INSERT INTO "+tname+" VALUES(?,?)",(sender,message))
80 connection.commit()
81 connection.close()
82
83 def get_chat(self,cID,sID):
84 tname = self.make_tname(cID,sID)
85 connection = sqlite3.connect("chats.db")
86 cur = connection.cursor()
87 try:
88 cur.execute("SELECT * FROM "+tname)
89 result = cur.fetchall()
90 except:
91 result = []
92 connection.close()
93 return(result)
94
95 def get_all_users(self,sID):
96 ssID = add_nulls(8,str(sID))
97 connection = sqlite3.connect("chats.db")
98 cur = connection.cursor()
99 cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
100 usr = cur.fetchall()
101 usrs = []
102 for i in usr:
103 t = i[0]
104 if(t[12:]==ssID):
105 usrs.append(t[4:12])
106 return(usrs)
107
108class connection:
109 def __init__(self,serv):
110 self.addr = serv[2]
111 self.port = int(serv[3])
112 self.login = serv[4]
113 self.pwd = serv[5]
114 self.key = 0
115 self.ID = 0
116
117 def check_connection(self):
118 key,ID = self.perform_login()
119 self.key = key
120 self.ID = ID
121 if(key!=0 and ID!=0):
122 return(1)
123 else:
124 return(0)
125
126 def get_users(self):
127 msg = "WOLFIN".encode("utf-8")
128 msglen = len(msg)
129 t,sock = self.say_hello(msglen)
130 if(t==1):
131 sock.send(msg)
132 answ = sock.recv(18).decode("utf-8")
133 if(answ[:2]=="OK"):
134 torec = int(answ[2:])
135 answ = sock.recv(torec)
136 answ = answ.decode("utf-8")
137 to_ret = []
138 while(len(answ)>8):
139 to_ret.append(answ[:8])
140 answ = answ[8:]
141 to_ret.append(answ)
142 return(to_ret)
143 else:
144 return([])
145
146
147 def check_key(self):
148 sock = socket.socket()
149 sock.connect((self.addr, self.port))
150 msg = ("CHK"+str(self.key)).encode("utf-8")
151 sock.send(msg)
152 answ = sock.recv(6)
153 print(answ)
154
155 def say_hello(self,size):
156 sock = socket.socket()
157 sock.connect((self.addr, self.port))
158 msg = ("MES0001"+add_nulls(4,str(size))).encode("utf-8")
159 sock.send(msg)
160 answ = sock.recv(6)
161 answ = answ.decode("utf-8")
162 if(answ[:2]=="OK"):
163 return(1,sock)
164 else:
165 return(0,sock)
166
167 def perform_login(self):
168 login = self.login.encode("utf-8")
169 pwd = self.pwd.encode("utf-8")
170 llen = add_nulls(4,str(len(login))).encode("utf-8")
171 pwdlen = add_nulls(4,str(len(pwd))).encode("utf-8")
172 msg = "LOG".encode("utf-8")+llen+pwdlen+login+pwd+"FIN".encode("utf-8")
173 msglen = len(msg)
174 t,sock = self.say_hello(msglen)
175 if(t==1):
176 sock.send(msg)
177 answ = sock.recv(18)
178 answ = answ.decode("utf-8")
179 if(answ[:2]=="OK"):
180 key = int(answ[2:10])
181 ID = int(answ[10:])
182 return(key,ID)
183 else:
184 return(0,0)
185 else:
186 return(0,0)
187
188
189 def send_msg(self,msg,tid):
190 sidstr = add_nulls(8,str(self.ID))
191 tidstr = add_nulls(8,str(tid))
192 kkey = add_nulls(8,str(self.key))
193 smsg = ("MSG"+sidstr+kkey+tidstr+msg+"FIN").encode("utf-8")
194 msglen = len(smsg)
195 t,sock = self.say_hello(msglen)
196 if(t==1):
197 sock.send(smsg)
198 answ = sock.recv(18)
199 answ = answ.decode("utf-8")
200 if(answ[:2]=="OK"):
201 return(1)
202 else:
203 return(0)
204 else:
205 return(0)
206
207 def get_messages(self):
208 kkey = add_nulls(8,str(self.key))
209 smsg = ("UPD"+kkey+"FIN").encode("utf-8")
210 msglen = len(smsg)
211 t,sock = self.say_hello(msglen)
212 if(t==1):
213 sock.send(smsg)
214 answ = sock.recv(18)
215 torec = 0
216 try:
217 answ=answ.decode("utf-8")
218 except:
219 return(0)
220 if(answ[:2]=="OK"):
221 try:
222 torec = int(answ[2:])
223 except:
224 return(0)
225 answ2 = sock.recv(torec)
226 to_ret = []
227 while(len(answ2)>4):
228 sender = int(answ2[:8].decode("utf-8"))
229 msglen = int(answ2[8:12].decode("utf-8"))
230 msg = answ2[12:12+msglen]
231 answ2 = answ2[12+msglen:]
232 to_ret.append((sender,msg))
233 return(to_ret)
234 else:
235 return(-1)
236 else:
237 return(0)
238
239
240class prog_windowed:
241 def __init__(self):
242 self.aID = 0
243 self.curuid = 0
244 self.settings = settings()
245 self.chathist = history()
246 self.mw = tkinter.Tk()
247 self.mw.geometry("800x600")
248 servers = self.settings.get_all_servers()
249 if(servers==[]):
250 self.make_serv_adding()
251 else:
252 self.show_serverlist()
253 self.mw.mainloop()
254
255 def make_serv_adding(self):
256 try:
257 self.sl.destroy()
258 except:
259 pass
260 self.sadd = tkinter.Toplevel()
261 self.sadd.title("Add a server")
262 self.sadd.geometry("300x300")
263 self.l1 = tkinter.Label(self.sadd,text="Serv name")
264 self.l1.pack()
265 self.addname = tkinter.Entry(self.sadd)
266 self.addname.pack()
267
268 self.l2 = tkinter.Label(self.sadd,text="Serv addr")
269 self.l2.pack()
270 self.addaddr = tkinter.Entry(self.sadd)
271 self.addaddr.pack()
272
273 self.l3 = tkinter.Label(self.sadd,text="Serv port")
274 self.l3.pack()
275 self.addport = tkinter.Entry(self.sadd)
276 self.addport.pack()
277
278 self.l4 = tkinter.Label(self.sadd,text="Login")
279 self.l4.pack()
280 self.addlogin = tkinter.Entry(self.sadd)
281 self.addlogin.pack()
282
283 self.l5 = tkinter.Label(self.sadd,text="Password")
284 self.l5.pack()
285 self.addpwd = tkinter.Entry(self.sadd)
286 self.addpwd.pack()
287
288 self.acceptbtn = tkinter.Button(self.sadd,text="Save",command = self.save_serv)
289 self.acceptbtn.pack()
290
291 def save_serv(self):
292 sname = self.addname.get()
293 saddr = self.addaddr.get()
294 sport = self.addport.get()
295 slogin = self.addlogin.get()
296 spassw = self.addpwd.get()
297 self.settings.save_server(sname,saddr,sport,slogin,spassw)
298 self.sadd.destroy()
299 self.show_serverlist()
300
301 def show_serverlist(self):
302 self.sl = tkinter.Toplevel()
303 self.sl.title("Choose a server to connect")
304 self.sl.geometry("300x300")
305
306 self.servs = self.settings.get_all_servers()
307
308 self.l1 = tkinter.Label(self.sl,text = "Select a server from list")
309 self.l1.pack()
310
311 self.slist = tkinter.Listbox(self.sl)
312 for i in self.servs:
313 self.slist.insert(tkinter.END, i[1])
314 self.slist.pack()
315
316 self.cbtn = tkinter.Button(self.sl,text="Connect",command = self.connserv)
317 self.cbtn.pack()
318
319 self.abtn = tkinter.Button(self.sl,text="Add new server",command = self.make_serv_adding)
320 self.abtn.pack()
321
322 def connserv(self):
323 self.current_server = self.servs[int(self.slist.curselection()[0])]
324 self.sl.destroy()
325 self.connection = connection(self.current_server)
326 t = self.connection.check_connection()
327 if(t==0):
328 self.show_serverlist()
329 else:
330 self.make_ulist()
331 self.make_chatwindow()
332
333 def make_ulist(self):
334 allusers = self.chathist.get_all_users(self.current_server[0])
335 onlines = self.connection.get_users()
336 ulist = allusers
337 for i in onlines:
338 if(i not in ulist):
339 ulist.append(i)
340 self.ulist = ulist
341 self.writelist = []
342 for i in ulist:
343 if(i in onlines):
344 self.writelist.append(i+"(online)")
345 else:
346 self.writelist.append(i)
347
348
349
350 def make_chatwindow(self):
351 self.texts = tkinter.Text(self.mw)
352 self.texts.configure(width=60)
353 self.texts.place(x=10,y=10)
354
355 self.users = tkinter.Listbox(self.mw)
356 self.users.configure(height = 23)
357 self.users.place(x=600,y=10)
358 for u in self.writelist:
359 self.users.insert(tkinter.END,str(u))
360 self.users.bind("<Double-Button-1>",self.change_chat)
361
362 self.msgenter = tkinter.Entry(self.mw)
363 self.msgenter.configure(width=80)
364 self.msgenter.place(x=10,y=500)
365 self.msgenter.bind("<Return>",self.sendmsg)
366
367 self.l1 = tkinter.Label(self.mw,text="Message:")
368 self.l1.place(x=10,y=470)
369
370 self.sendbtn = tkinter.Button(self.mw,text="Send",command = self.sendmsg2)
371 self.sendbtn.place(x=500,y=497)
372
373 self.l2 = tkinter.Label(self.mw,text="Your ID is: "+str(self.connection.ID))
374 self.l2.place(x=10,y=550)
375
376 self.l2 = tkinter.Label(self.mw,text="Chat with: "+str(self.curuid))
377 self.l2.place(x=10,y=400)
378
379 self.aID = self.mw.after(100,self.check_chats)
380
381 def change_chat(self,pressed):
382 uid = self.ulist[int(self.users.curselection()[0])]
383 self.curuid = uid
384 self.l2.configure(text="Chat with: "+str(self.curuid))
385 self.check_chats()
386
387 def sendmsg2(self):
388 self.sendmsg(123)
389
390 def sendmsg(self,shit):
391 msg = self.msgenter.get()
392 t = self.connection.send_msg(msg,self.curuid)
393 if(t==1):
394 self.chathist.add_msg(self.curuid,self.current_server[0],0,msg.encode("utf-8"))
395 self.msgenter.delete("0",tkinter.END)
396 self.check_chats()
397 else:
398 return
399
400 def check_chats(self):
401 self.mw.after_cancel(self.aID)
402 uid = self.curuid
403 msgs = self.connection.get_messages()
404 if(type(msgs) == type([])):
405 for msg in msgs:
406 self.chathist.add_msg(msg[0],self.current_server[0],1,msg[1])
407 data = self.chathist.get_chat(self.curuid,self.current_server[0])
408 to_write = []
409 for msg in data:
410 outmsg = ""
411 if(msg[0]==0):
412 outmsg+="You: "
413 else:
414 outmsg+=str(self.curuid)+": "
415 try:
416 outmsg+=msg[1].decode("utf-8")
417 except:
418 outmsg+="blob data"
419 to_write.append(outmsg)
420 to_write.reverse()
421 stw = "\n".join(to_write)
422 check = self.texts.get("0.0",tkinter.END)
423 self.make_ulist()
424 self.users.delete('0',tkinter.END)
425 for u in self.writelist:
426 self.users.insert(tkinter.END,str(u))
427 if(check.replace("\n","")!=stw.replace("\n","")):
428 self.texts.delete('0.0',tkinter.END)
429 self.texts.insert(tkinter.END,stw)
430 self.aID = self.mw.after(10000,self.check_chats)
431
432a = prog_windowed()