Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import chatango
- import _thread
- import random
- from tkinter import *
- import time
- import datetime
- #Chatango Lib by GuyFox
- #Chatango Client by MegaLoler
- #Not nearly finished
- #Todo list:
- #Styles
- #Logging
- #Click on username to add @username to the input field
- #Highlight messages containing @yourusername
- #Make hyperlinks clickable
- #Embed images and youtube videos (if that's possible)
- #Add friends list
- #Message time
- #Avatars
- #Put main window in task bar
- #If user closes login window, exit instead of logging in as nothing
- #Preferences window
- #Smileys
- #Sound
- #Tabs in windows
- #New message notification somehow
- #Remember open chats
- #Remember credentials
- USER = ""
- PASS = ""
- pm = None
- queue = list()
- windowss = list()
- newWindowsQueue = list()
- root = Tk()
- root.title("Login")
- root.resizable(width=FALSE, height=FALSE)
- def makeentry(parent, caption, r, **options):
- Label(parent, text=caption).grid(row=r, sticky=E)
- entry = Entry(parent, **options)
- entry.config(width=20)
- entry.grid(row=r, column=1)
- return entry
- frame = Frame(root)
- frame.pack()
- user = makeentry(frame, "Username:", 0)
- password = makeentry(frame, "Password:", 1, show="*")
- user.focus_set()
- def login(event=None):
- global pm
- global USER
- global PASS
- print("Logging in...")
- USER = user.get()
- PASS = password.get()
- try:
- pm = chatango.pms(USER, PASS)
- pm.login()
- root.destroy()
- except:
- print("Error logging in.")
- Button(frame, text="Login", command=login).grid(row=2, column=1, sticky=E)
- root.bind("<Return>", login)
- root.mainloop()
- print("Logged in succesfully.")
- class PmWindow():
- def __init__(self, pm, friend):
- self.type = "pm"
- self.pm = pm
- self.friend = friend
- self.root = Tk()
- self.root.title(friend)
- self.root.resizable(width=FALSE, height=FALSE)
- self.root.bind("<Return>", self._send)
- frame = Frame(self.root)
- frame.pack()
- self.e = Entry(frame)
- self.e.focus_set()
- self.e.pack(fill=X, side=BOTTOM, expand=1)
- scrollbar = Scrollbar(frame)
- scrollbar.pack(side=RIGHT, fill=Y, expand=1)
- self.t = Text(frame)
- self.t.config(state=DISABLED)
- self.t.pack(fill=BOTH, expand=1)
- self.t.tag_config(0, font=("courier", 10, 'normal'))
- self.t.tag_config(1, font=("courier", 10, 'bold'))
- self.t.tag_config(2, font=("courier", 10, 'bold underline'))
- self.t.tag_config(3, foreground="#999", font=("courier", 10, 'italic'))
- self.t.tag_config(4, foreground="#999", font=("courier", 8, 'normal'))
- self.t.config(yscrollcommand=scrollbar.set)
- scrollbar.config(command=self.t.yview)
- logInOut(True, self.friend)
- self._load()
- def _send(self, event=None):
- mes = self.e.get()
- self.e.delete(0, END)
- self.pm.send(self.friend, mes)
- self._add(self.pm._username, mes, time.time())
- logPm2(self.pm._username, mes, time.time(),self.friend)
- def close(self):
- logInOut(False, self.friend)
- def _add(self, user, msg, msgtime):
- self.t.config(state=NORMAL)
- self.t.insert(END, "(" + str(datetime.date.fromtimestamp(float(msgtime)).strftime("%d/%m/%y %H:%M:%S")) + ") ", 4)
- if user.lower() == self.pm._username.lower():
- self.t.insert(END, user + ":", 2)
- else:
- self.t.insert(END, user + ":", 1)
- self.t.insert(END, " " + msg + "\n", 0)
- self.t.config(state=DISABLED)
- self.t.yview(END)
- def _event(self, msg):
- self.t.config(state=NORMAL)
- self.t.insert(END, msg + "\n", 3)
- self.t.config(state=DISABLED)
- self.t.yview(END)
- def _load(self):
- f = open("C:\\chatango\\" + self.friend, 'r')
- dat = f.read()
- f.close()
- dat = dat.split("\n")
- for i in dat:
- try:
- pars = i.split("|")
- typ = pars[0]
- if typ == "message":
- tim = float(pars[1])
- con = pars[2]
- usr = pars[3]
- ut = int(pars[4])
- usr = chatango.chuser(usr)
- usr.type = ut
- mes = chatango.chmessage()
- mes.posttime = tim
- mes.user = usr
- mes.content = con
- newevent = {"event": typ, "message": mes}
- queue.append(["", newevent])
- else:
- usr = pars[1]
- newevent = {"event": typ, "username": usr}
- queue.append(["", newevent])
- except:
- pass
- def loop(self):
- n = 0
- for ev in queue:
- if ev[1]["event"] == "message":
- if (ev[1]["message"].user.username == self.friend.lower() or ev[1]["message"].user.username == self.pm._username.lower()) and ev[0] == "":
- self._add(ev[1]["message"].user.displayname, ev[1]["message"].content, ev[1]["message"].posttime)
- del queue[n]
- break
- elif ev[1]["event"] == "login":
- if (ev[1]["username"] == self.friend.lower() or ev[1]["username"] == self.pm._username.lower()) and ev[0] == "":
- self._event(ev[1]["username"] + " logged in.")
- del queue[n]
- break
- elif ev[1]["event"] == "logout":
- if (ev[1]["username"] == self.friend.lower() or ev[1]["username"] == self.pm._username.lower()) and ev[0] == "":
- self._event(ev[1]["username"] + " logged out.")
- del queue[n]
- break
- n = n + 1
- self.root.update()
- class RoomWindow():
- def __init__(self, room):
- self.type = "room"
- self.room = room
- self.root = Tk()
- self.root.title(room.name)
- self.root.resizable(width=FALSE, height=FALSE)
- self.root.bind("<Return>", self._send)
- frame = Frame(self.root)
- frame.pack()
- self.e = Entry(frame)
- self.e.focus_set()
- self.e.pack(fill=X, side=BOTTOM, expand=1)
- scrollbar = Scrollbar(frame)
- scrollbar.pack(side=RIGHT, fill=Y, expand=1)
- self.t = Text(frame)
- self.t.config(state=DISABLED)
- self.t.pack(fill=BOTH, expand=1)
- self.t.tag_config(0, font=("courier", 10, 'normal'))
- self.t.tag_config(1, font=("courier", 10, 'bold'))
- self.t.tag_config(2, font=("courier", 10, 'bold underline'))
- self.t.tag_config(3, foreground="#999", font=("courier", 10, 'italic'))
- self.t.tag_config(4, foreground="#999", font=("courier", 8, 'normal'))
- self.t.config(yscrollcommand=scrollbar.set)
- scrollbar.config(command=self.t.yview)
- logInOut(True, self.room.name)
- self._load()
- def _send(self, event=None):
- mes = self.e.get()
- self.e.delete(0, END)
- self.room.say(mes)
- def close(self):
- self.room.disconnect()
- logInOut(False, self.room.name)
- def _add(self, user, msg, msgtime):
- self.t.config(state=NORMAL)
- self.t.insert(END, "(" + str(datetime.date.fromtimestamp(float(msgtime)).strftime("%d/%m/%y %H:%M:%S")) + ") ", 4)
- if user.lower() == USER.lower():
- self.t.insert(END, user + ":", 2)
- else:
- self.t.insert(END, user + ":", 1)
- self.t.insert(END, " " + msg + "\n", 0)
- self.t.config(state=DISABLED)
- self.t.yview(END)
- def _event(self, msg):
- self.t.config(state=NORMAL)
- self.t.insert(END, msg + "\n", 3)
- self.t.config(state=DISABLED)
- self.t.yview(END)
- def _load(self):
- f = open("C:\\chatango\\" + self.room.name, 'r')
- dat = f.read()
- f.close()
- dat = dat.split("\n")
- for i in dat:
- try:
- pars = i.split("|")
- typ = pars[0]
- if typ == "message":
- tim = float(pars[1])
- con = pars[2]
- usr = pars[3]
- ut = int(pars[4])
- ip = pars[5]
- usr = chatango.chuser(usr)
- usr.type = ut
- mes = chatango.chmessage()
- mes.posttime = tim
- mes.user = usr
- mes.content = con
- mes.ip = ip
- newevent = {"event": typ, "message": mes}
- queue.append([self.room.name, newevent])
- elif typ == "nickchange":
- new = pars[1]
- old = pars[2]
- newevent = {"event": typ, "old": old, "new": new}
- queue.append([self.room.name, newevent])
- else:
- usr = pars[1]
- newevent = {"event": typ, "username": usr}
- queue.append([self.room.name, newevent])
- except:
- pass
- def loop(self):
- n = 0
- for ev in queue:
- if ev[0] == self.room.name.lower():
- if ev[1]["event"] == "message":
- self._add(ev[1]["message"].user.displayname, ev[1]["message"].content, ev[1]["message"].posttime)
- elif ev[1]["event"] == "login":
- self._event(ev[1]["username"] + " logged in.")
- elif ev[1]["event"] == "logout":
- self._event(ev[1]["username"] + " logged out.")
- elif ev[1]["event"] == "nickchange":
- self._event(ev[1]["old"].displayname + " is now known as " + ev[1]["new"].displayname + ".")
- del queue[n]
- break
- n = n + 1
- self.root.update()
- def newPmWindow(event=None):
- user = chat.get()
- windowss.append(PmWindow(pm, user))
- def newPmWindow3(event=None):
- room = join.get()
- room = chatango.chatroom(room)
- room.login(USER,PASS)
- windowss.append(RoomWindow(room))
- _thread.start_new_thread(getEvents2, (room, queue,))
- def newPmWindow2(user):
- windowss.append(PmWindow(pm, user))
- def logRoom(room, event):
- if event["event"] == "message":
- saveString = "message" + "|" + str(event["message"].posttime) + "|" + event["message"].content + "|" + event["message"].user.displayname + "|" + str(event["message"].user.type) + "|" + str(event["message"].user.ip) + "\n"
- elif event["event"] == "login":
- saveString = "login" + "|" + event["username"] + "\n"
- elif event["event"] == "logout":
- saveString = "logout" + "|" + event["username"] + "\n"
- elif event["event"] == "nickchange":
- saveString = "nickchange" + "|" + event["new"].displayname + "|" + event["old"].displayname + "\n"
- try:
- f = open('C:\\chatango\\' + room, 'a')
- except:
- f = open('C:\\chatango\\' + room, 'w')
- f.write(saveString)
- f.close()
- def logPm2(user, mes, times, usr):
- saveString = "message" + "|" + str(times) + "|" + mes + "|" + user + "|" + "2" + "\n"
- try:
- f = open("C:\\chatango\\" + usr.lower(), 'a')
- except:
- f = open("C:\\chatango\\" + usr.lower(), 'w')
- f.write(saveString)
- f.close()
- def logInOut(login, user):
- if login:
- saveString = "login" + "|" + USER + "\n"
- else:
- saveString = "logout" + "|" + USER + "\n"
- try:
- f = open("C:\\chatango\\" + user.lower(), 'a')
- except:
- f = open("C:\\chatango\\" + user.lower(), 'w')
- f.write(saveString)
- f.close()
- def logPm(event):
- if event["event"] == "message":
- saveString = "message" + "|" + str(event["message"].posttime) + "|" + event["message"].content + "|" + event["message"].user.displayname + "|" + str(event["message"].user.type) + "\n"
- user = event["message"].user.displayname
- elif event["event"] == "login":
- saveString = "login" + "|" + event["username"] + "\n"
- user = event["username"]
- elif event["event"] == "logout":
- saveString = "logout" + "|" + event["username"] + "\n"
- user = event["username"]
- try:
- f = open("C:\\chatango\\" + user.lower(), 'a')
- except:
- f = open("C:\\chatango\\" + user.lower(), 'w')
- f.write(saveString)
- f.close()
- def getEvents(pm,queue):
- while 1:
- try:
- ev = pm.get_event()
- logPm(ev)
- queue.append(["", ev])
- if ev["event"] == "message":
- print("(" + str(datetime.date.fromtimestamp(float(ev["message"].posttime)).strftime("%d/%m/%y %H:%M:%S")) + ") " + ev["message"].user.displayname + ": " + ev["message"].content)
- exists = False
- for i in windowss:
- if i.type == "pm":
- if i.friend.lower() == ev["message"].user.username:
- exists = True
- break
- if not exists:
- newWindowsQueue.append(ev["message"].user.displayname)
- elif ev["event"] == "login":
- print(ev["username"] + " logged in.")
- elif ev["event"] == "logout":
- print(ev["username"] + " logged out.")
- except:
- break
- def getEvents2(room,queue):
- while 1:
- try:
- ev = room.get_event()
- logRoom(room.name, ev)
- queue.append([room.name, ev])
- if ev["event"] == "message":
- 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)
- elif ev["event"] == "login":
- print(room.name + ": " + ev["username"] + " logged in.")
- elif ev["event"] == "logout":
- print(room.name + ": " + ev["username"] + " logged out.")
- elif ev["event"] == "nickchange":
- print(room.name + ": " + ev["old"].displayname + " is now known as " + ev["new"].displayname + ".")
- except:
- break
- _thread.start_new_thread(getEvents, (pm, queue,))
- root = Tk()
- root.title(USER)
- root.resizable(width=FALSE, height=FALSE)
- frame = Frame(root)
- frame.pack()
- chat = makeentry(frame, "Chat with:", 0)
- chat.focus_set()
- Button(frame, text="Chat", command=newPmWindow).grid(row=1, column=1, sticky=E)
- join = makeentry(frame, "Or join room:", 2)
- join.focus_set()
- Button(frame, text="Join", command=newPmWindow3).grid(row=3, column=1, sticky=E)
- while 1:
- while len(newWindowsQueue) > 0:
- newPmWindow2(newWindowsQueue[0])
- del newWindowsQueue[0]
- try:
- root.update()
- except:
- break
- n = 0
- d = 0
- for i in windowss[0:len(windowss)]:
- try:
- i.loop()
- except:
- i.close()
- del windowss[n - d]
- d = d + 1
- n = n + 1
- print("Disconnecting...")
- pm.disconnect()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement