Advertisement
Guest User

Untitled

a guest
Sep 8th, 2017
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.24 KB | None | 0 0
  1. import chatango
  2. import _thread
  3. import random
  4. from tkinter import *
  5. import time
  6. import datetime
  7.  
  8. #Chatango Lib by GuyFox
  9. #Chatango Client by MegaLoler
  10. #Not nearly finished
  11.  
  12. #Todo list:
  13. #Styles
  14. #Logging
  15. #Click on username to add @username to the input field
  16. #Highlight messages containing @yourusername
  17. #Make hyperlinks clickable
  18. #Embed images and youtube videos (if that's possible)
  19. #Add friends list
  20. #Message time
  21. #Avatars
  22. #Put main window in task bar
  23. #If user closes login window, exit instead of logging in as nothing
  24. #Preferences window
  25. #Smileys
  26. #Sound
  27. #Tabs in windows
  28. #New message notification somehow
  29. #Remember open chats
  30. #Remember credentials
  31.  
  32. USER = ""
  33. PASS = ""
  34. pm = None
  35. queue = list()
  36. windowss = list()
  37. newWindowsQueue = list()
  38.  
  39. root = Tk()
  40. root.title("Login")
  41. root.resizable(width=FALSE, height=FALSE)
  42.  
  43. def makeentry(parent, caption, r, **options):
  44.     Label(parent, text=caption).grid(row=r, sticky=E)
  45.     entry = Entry(parent, **options)
  46.     entry.config(width=20)
  47.     entry.grid(row=r, column=1)
  48.     return entry
  49.  
  50. frame = Frame(root)
  51. frame.pack()
  52. user = makeentry(frame, "Username:", 0)
  53. password = makeentry(frame, "Password:", 1, show="*")
  54. user.focus_set()
  55.  
  56. def login(event=None):
  57.     global pm
  58.     global USER
  59.     global PASS
  60.     print("Logging in...")
  61.     USER = user.get()
  62.     PASS = password.get()
  63.     try:
  64.         pm = chatango.pms(USER, PASS)
  65.         pm.login()
  66.         root.destroy()
  67.     except:
  68.         print("Error logging in.")
  69.    
  70. Button(frame, text="Login", command=login).grid(row=2, column=1, sticky=E)
  71. root.bind("<Return>", login)
  72.  
  73. root.mainloop()
  74.  
  75. print("Logged in succesfully.")
  76.  
  77. class PmWindow():
  78.     def __init__(self, pm, friend):
  79.         self.type = "pm"
  80.         self.pm = pm
  81.         self.friend = friend
  82.  
  83.         self.root = Tk()
  84.         self.root.title(friend)
  85.         self.root.resizable(width=FALSE, height=FALSE)
  86.         self.root.bind("<Return>", self._send)
  87.  
  88.         frame = Frame(self.root)
  89.         frame.pack()
  90.  
  91.         self.e = Entry(frame)
  92.         self.e.focus_set()
  93.         self.e.pack(fill=X, side=BOTTOM, expand=1)
  94.  
  95.         scrollbar = Scrollbar(frame)
  96.         scrollbar.pack(side=RIGHT, fill=Y, expand=1)
  97.  
  98.         self.t = Text(frame)
  99.         self.t.config(state=DISABLED)
  100.         self.t.pack(fill=BOTH, expand=1)
  101.        
  102.         self.t.tag_config(0, font=("courier", 10, 'normal'))
  103.         self.t.tag_config(1, font=("courier", 10, 'bold'))
  104.         self.t.tag_config(2, font=("courier", 10, 'bold underline'))
  105.         self.t.tag_config(3, foreground="#999", font=("courier", 10, 'italic'))
  106.         self.t.tag_config(4, foreground="#999", font=("courier", 8, 'normal'))
  107.  
  108.         self.t.config(yscrollcommand=scrollbar.set)
  109.         scrollbar.config(command=self.t.yview)
  110.  
  111.         logInOut(True, self.friend)
  112.         self._load()
  113.        
  114.     def _send(self, event=None):
  115.         mes = self.e.get()
  116.         self.e.delete(0, END)
  117.         self.pm.send(self.friend, mes)
  118.         self._add(self.pm._username, mes, time.time())
  119.         logPm2(self.pm._username, mes, time.time(),self.friend)
  120.        
  121.     def close(self):
  122.         logInOut(False, self.friend)
  123.        
  124.     def _add(self, user, msg, msgtime):
  125.         self.t.config(state=NORMAL)
  126.         self.t.insert(END, "(" + str(datetime.date.fromtimestamp(float(msgtime)).strftime("%d/%m/%y %H:%M:%S")) + ") ", 4)
  127.         if user.lower() == self.pm._username.lower():
  128.             self.t.insert(END, user + ":", 2)
  129.         else:
  130.             self.t.insert(END, user + ":", 1)
  131.         self.t.insert(END, " " + msg + "\n", 0)
  132.         self.t.config(state=DISABLED)
  133.         self.t.yview(END)
  134.        
  135.     def _event(self, msg):
  136.         self.t.config(state=NORMAL)
  137.         self.t.insert(END, msg + "\n", 3)
  138.         self.t.config(state=DISABLED)
  139.         self.t.yview(END)
  140.        
  141.     def _load(self):
  142.         f = open("C:\\chatango\\" + self.friend, 'r')
  143.         dat = f.read()
  144.         f.close()
  145.         dat = dat.split("\n")
  146.         for i in dat:
  147.             try:
  148.                 pars = i.split("|")
  149.                 typ = pars[0]
  150.                 if typ == "message":
  151.                     tim = float(pars[1])
  152.                     con = pars[2]
  153.                     usr = pars[3]
  154.                     ut = int(pars[4])
  155.                     usr = chatango.chuser(usr)
  156.                     usr.type = ut
  157.                     mes = chatango.chmessage()
  158.                     mes.posttime = tim
  159.                     mes.user = usr
  160.                     mes.content = con
  161.                     newevent = {"event": typ, "message": mes}
  162.                     queue.append(["", newevent])
  163.                 else:
  164.                     usr = pars[1]
  165.                     newevent = {"event": typ, "username": usr}
  166.                     queue.append(["", newevent])
  167.             except:
  168.                 pass
  169.  
  170.     def loop(self):
  171.         n = 0
  172.         for ev in queue:
  173.             if ev[1]["event"] == "message":
  174.                 if (ev[1]["message"].user.username == self.friend.lower() or ev[1]["message"].user.username == self.pm._username.lower()) and ev[0] == "":
  175.                     self._add(ev[1]["message"].user.displayname, ev[1]["message"].content, ev[1]["message"].posttime)
  176.                     del queue[n]
  177.                     break
  178.             elif ev[1]["event"] == "login":
  179.                 if (ev[1]["username"] == self.friend.lower() or ev[1]["username"] == self.pm._username.lower()) and ev[0] == "":
  180.                     self._event(ev[1]["username"] + " logged in.")
  181.                     del queue[n]
  182.                     break
  183.             elif ev[1]["event"] == "logout":
  184.                 if (ev[1]["username"] == self.friend.lower() or ev[1]["username"] == self.pm._username.lower()) and ev[0] == "":
  185.                     self._event(ev[1]["username"] + " logged out.")
  186.                     del queue[n]
  187.                     break
  188.             n = n + 1
  189.         self.root.update()
  190.  
  191. class RoomWindow():
  192.     def __init__(self, room):
  193.         self.type = "room"
  194.         self.room = room
  195.  
  196.         self.root = Tk()
  197.         self.root.title(room.name)
  198.         self.root.resizable(width=FALSE, height=FALSE)
  199.         self.root.bind("<Return>", self._send)
  200.  
  201.         frame = Frame(self.root)
  202.         frame.pack()
  203.  
  204.         self.e = Entry(frame)
  205.         self.e.focus_set()
  206.         self.e.pack(fill=X, side=BOTTOM, expand=1)
  207.  
  208.         scrollbar = Scrollbar(frame)
  209.         scrollbar.pack(side=RIGHT, fill=Y, expand=1)
  210.  
  211.         self.t = Text(frame)
  212.         self.t.config(state=DISABLED)
  213.         self.t.pack(fill=BOTH, expand=1)
  214.        
  215.         self.t.tag_config(0, font=("courier", 10, 'normal'))
  216.         self.t.tag_config(1, font=("courier", 10, 'bold'))
  217.         self.t.tag_config(2, font=("courier", 10, 'bold underline'))
  218.         self.t.tag_config(3, foreground="#999", font=("courier", 10, 'italic'))
  219.         self.t.tag_config(4, foreground="#999", font=("courier", 8, 'normal'))
  220.  
  221.         self.t.config(yscrollcommand=scrollbar.set)
  222.         scrollbar.config(command=self.t.yview)
  223.  
  224.         logInOut(True, self.room.name)
  225.         self._load()
  226.        
  227.     def _send(self, event=None):
  228.         mes = self.e.get()
  229.         self.e.delete(0, END)
  230.         self.room.say(mes)
  231.        
  232.     def close(self):
  233.         self.room.disconnect()
  234.         logInOut(False, self.room.name)
  235.        
  236.     def _add(self, user, msg, msgtime):
  237.         self.t.config(state=NORMAL)
  238.         self.t.insert(END, "(" + str(datetime.date.fromtimestamp(float(msgtime)).strftime("%d/%m/%y %H:%M:%S")) + ") ", 4)
  239.         if user.lower() == USER.lower():
  240.             self.t.insert(END, user + ":", 2)
  241.         else:
  242.             self.t.insert(END, user + ":", 1)
  243.         self.t.insert(END, " " + msg + "\n", 0)
  244.         self.t.config(state=DISABLED)
  245.         self.t.yview(END)
  246.        
  247.     def _event(self, msg):
  248.         self.t.config(state=NORMAL)
  249.         self.t.insert(END, msg + "\n", 3)
  250.         self.t.config(state=DISABLED)
  251.         self.t.yview(END)
  252.        
  253.     def _load(self):
  254.         f = open("C:\\chatango\\" + self.room.name, 'r')
  255.         dat = f.read()
  256.         f.close()
  257.         dat = dat.split("\n")
  258.         for i in dat:
  259.             try:
  260.                 pars = i.split("|")
  261.                 typ = pars[0]
  262.                 if typ == "message":
  263.                     tim = float(pars[1])
  264.                     con = pars[2]
  265.                     usr = pars[3]
  266.                     ut = int(pars[4])
  267.                     ip = pars[5]
  268.                     usr = chatango.chuser(usr)
  269.                     usr.type = ut
  270.                     mes = chatango.chmessage()
  271.                     mes.posttime = tim
  272.                     mes.user = usr
  273.                     mes.content = con
  274.                     mes.ip = ip
  275.                     newevent = {"event": typ, "message": mes}
  276.                     queue.append([self.room.name, newevent])
  277.                 elif typ == "nickchange":
  278.                     new = pars[1]
  279.                     old = pars[2]
  280.                     newevent = {"event": typ, "old": old, "new": new}
  281.                     queue.append([self.room.name, newevent])
  282.                 else:
  283.                     usr = pars[1]
  284.                     newevent = {"event": typ, "username": usr}
  285.                     queue.append([self.room.name, newevent])
  286.             except:
  287.                 pass
  288.  
  289.     def loop(self):
  290.         n = 0
  291.         for ev in queue:
  292.             if ev[0] == self.room.name.lower():
  293.                 if ev[1]["event"] == "message":
  294.                     self._add(ev[1]["message"].user.displayname, ev[1]["message"].content, ev[1]["message"].posttime)
  295.                 elif ev[1]["event"] == "login":
  296.                     self._event(ev[1]["username"] + " logged in.")
  297.                 elif ev[1]["event"] == "logout":
  298.                     self._event(ev[1]["username"] + " logged out.")
  299.                 elif ev[1]["event"] == "nickchange":
  300.                     self._event(ev[1]["old"].displayname + " is now known as " + ev[1]["new"].displayname + ".")
  301.                 del queue[n]
  302.                 break
  303.             n = n + 1
  304.         self.root.update()
  305.  
  306. def newPmWindow(event=None):
  307.     user = chat.get()
  308.     windowss.append(PmWindow(pm, user))
  309.  
  310. def newPmWindow3(event=None):
  311.     room = join.get()
  312.     room = chatango.chatroom(room)
  313.     room.login(USER,PASS)
  314.     windowss.append(RoomWindow(room))
  315.     _thread.start_new_thread(getEvents2, (room, queue,))
  316.  
  317. def newPmWindow2(user):
  318.     windowss.append(PmWindow(pm, user))
  319.  
  320. def logRoom(room, event):
  321.     if event["event"] == "message":
  322.         saveString = "message" + "|" + str(event["message"].posttime) + "|" + event["message"].content + "|" + event["message"].user.displayname + "|" + str(event["message"].user.type) + "|" + str(event["message"].user.ip) + "\n"
  323.     elif event["event"] == "login":
  324.         saveString = "login" + "|" + event["username"] + "\n"
  325.     elif event["event"] == "logout":
  326.         saveString = "logout" + "|" + event["username"] + "\n"
  327.     elif event["event"] == "nickchange":
  328.         saveString = "nickchange" + "|" + event["new"].displayname + "|" + event["old"].displayname + "\n"
  329.     try:
  330.         f = open('C:\\chatango\\' + room, 'a')
  331.     except:
  332.         f = open('C:\\chatango\\' + room, 'w')
  333.     f.write(saveString)
  334.     f.close()
  335.  
  336. def logPm2(user, mes, times, usr):
  337.     saveString = "message" + "|" + str(times) + "|" + mes + "|" + user + "|" + "2" + "\n"
  338.     try:
  339.         f = open("C:\\chatango\\" + usr.lower(), 'a')
  340.     except:
  341.         f = open("C:\\chatango\\" + usr.lower(), 'w')
  342.     f.write(saveString)
  343.     f.close()
  344.  
  345. def logInOut(login, user):
  346.     if login:
  347.         saveString = "login" + "|" + USER + "\n"
  348.     else:
  349.         saveString = "logout" + "|" + USER + "\n"
  350.     try:
  351.         f = open("C:\\chatango\\" + user.lower(), 'a')
  352.     except:
  353.         f = open("C:\\chatango\\" + user.lower(), 'w')
  354.     f.write(saveString)
  355.     f.close()
  356.  
  357. def logPm(event):
  358.     if event["event"] == "message":
  359.         saveString = "message" + "|" + str(event["message"].posttime) + "|" + event["message"].content + "|" + event["message"].user.displayname + "|" + str(event["message"].user.type) + "\n"
  360.         user = event["message"].user.displayname
  361.     elif event["event"] == "login":
  362.         saveString = "login" + "|" + event["username"] + "\n"
  363.         user = event["username"]
  364.     elif event["event"] == "logout":
  365.         saveString = "logout" + "|" + event["username"] + "\n"
  366.         user = event["username"]
  367.     try:
  368.         f = open("C:\\chatango\\" + user.lower(), 'a')
  369.     except:
  370.         f = open("C:\\chatango\\" + user.lower(), 'w')
  371.     f.write(saveString)
  372.     f.close()
  373.  
  374. def getEvents(pm,queue):
  375.     while 1:
  376.         try:
  377.             ev = pm.get_event()
  378.             logPm(ev)
  379.             queue.append(["", ev])
  380.             if ev["event"] == "message":
  381.                 print("(" + str(datetime.date.fromtimestamp(float(ev["message"].posttime)).strftime("%d/%m/%y %H:%M:%S")) + ") " + ev["message"].user.displayname + ": " + ev["message"].content)
  382.                 exists = False
  383.                 for i in windowss:
  384.                     if i.type == "pm":
  385.                         if i.friend.lower() == ev["message"].user.username:
  386.                             exists = True
  387.                             break
  388.                 if not exists:
  389.                     newWindowsQueue.append(ev["message"].user.displayname)
  390.             elif ev["event"] == "login":
  391.                 print(ev["username"] + " logged in.")
  392.             elif ev["event"] == "logout":
  393.                 print(ev["username"] + " logged out.")
  394.         except:
  395.             break
  396.  
  397. def getEvents2(room,queue):
  398.     while 1:
  399.         try:
  400.             ev = room.get_event()
  401.             logRoom(room.name, ev)
  402.             queue.append([room.name, ev])
  403.             if ev["event"] == "message":
  404.                 print("(" + str(datetime.date.fromtimestamp(float(ev["message"].posttime)).strftime("%d/%m/%y %H:%M:%S")) + ") " + room.name + ": " + ev["message"].user.displayname + ": " + ev["message"].content)
  405.             elif ev["event"] == "login":
  406.                 print(room.name + ": " + ev["username"] + " logged in.")
  407.             elif ev["event"] == "logout":
  408.                 print(room.name + ": " + ev["username"] + " logged out.")
  409.             elif ev["event"] == "nickchange":
  410.                 print(room.name + ": " + ev["old"].displayname + " is now known as " + ev["new"].displayname + ".")
  411.         except:
  412.             break
  413.  
  414. _thread.start_new_thread(getEvents, (pm, queue,))
  415.  
  416. root = Tk()
  417. root.title(USER)
  418. root.resizable(width=FALSE, height=FALSE)
  419.  
  420. frame = Frame(root)
  421. frame.pack()
  422.  
  423. chat = makeentry(frame, "Chat with:", 0)
  424. chat.focus_set()
  425. Button(frame, text="Chat", command=newPmWindow).grid(row=1, column=1, sticky=E)
  426.  
  427. join = makeentry(frame, "Or join room:", 2)
  428. join.focus_set()
  429. Button(frame, text="Join", command=newPmWindow3).grid(row=3, column=1, sticky=E)
  430.  
  431. while 1:
  432.     while len(newWindowsQueue) > 0:
  433.         newPmWindow2(newWindowsQueue[0])
  434.         del newWindowsQueue[0]
  435.     try:
  436.         root.update()
  437.     except:
  438.         break
  439.     n = 0
  440.     d = 0
  441.     for i in windowss[0:len(windowss)]:
  442.         try:
  443.             i.loop()
  444.         except:
  445.             i.close()
  446.             del windowss[n - d]
  447.             d = d + 1
  448.         n = n + 1
  449.  
  450. print("Disconnecting...")
  451.  
  452. pm.disconnect()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement