Advertisement
Guest User

geisha

a guest
Mar 3rd, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 24.09 KB | None | 0 0
  1.  
  2. #!/usr/bin/python3
  3. from tkinter import *
  4. from tkinter import messagebox, ttk
  5. from tkinter.scrolledtext import ScrolledText
  6. from socket import socket
  7. from select import select
  8. from glob import glob
  9. from Crypto.Cipher import AES
  10. from Crypto.Hash import SHA3_512
  11. from binascii import b2a_hex, a2b_hex
  12. from pytz import timezone
  13. from datetime import datetime
  14. import os
  15. import sys, threading, time, ssl, string, random, win32gui
  16. import configparser
  17.  
  18.  
  19.  
  20. class PrpCrypt(object):
  21.  
  22.     def __init__(self, key):
  23.         self.key = key
  24.         self.mode = AES.MODE_CBC
  25.  
  26.     def encrypt(self, text):
  27.         text = text.encode('UTF-8')
  28.         cryptor = AES.new(self.key, self.mode, _IV)
  29.         length = 16
  30.         count = len(text)
  31.         if count < length:
  32.             add = (length - count)
  33.             text = text + ('\0' * add).encode('UTF-8')
  34.         elif count > length:
  35.             add = (length - (count % length))
  36.             text = text + ('\0' * add).encode('UTF-8')
  37.         self.ciphertext = cryptor.encrypt(text)
  38.         return b2a_hex(self.ciphertext)
  39.  
  40.     def decrypt(self, text):
  41.         cryptor = AES.new(self.key, self.mode, _IV)
  42.         plain_text = cryptor.decrypt(a2b_hex(text))
  43.         return bytes.decode(plain_text).rstrip('\0')
  44.  
  45.  
  46. class Window(Frame):
  47.     def __init__(self, master):
  48.         Frame.__init__(self, master)
  49.         self.root = master
  50.         self.sckt = socket()
  51.         self.parser = configparser.ConfigParser()
  52.         self.grid()
  53.         self.tabs = {}
  54.         self.init_window()
  55.         self.getuser_popup()
  56.         if len(glob("*.txt")) > 0:
  57.             sys.exit()
  58.  
  59.     def getuser_popup(self):# Builds the UI for the username entry window
  60.         self.checkSSL = IntVar()
  61.         self.checkSSL.set(0)
  62.         self.top = Toplevel()
  63.         self.top.transient(root)
  64.         w = 280
  65.         h = 240
  66.         sw = self.top.winfo_screenwidth()
  67.         sh = self.top.winfo_screenheight()
  68.         x = (sw - w)/2
  69.         y = (sh - h)/2
  70.         self.top.geometry('%dx%d+%d+%d' % (w, h, x, y))
  71.         self.enterUsername = Label(self.top, text = '动态昵称\n' + name)
  72.         self.enterUsername.place(x=112, y=32)
  73.         self.enterPASSWORD = Entry(self.top, show="*", width=10)
  74.         self.enterPASSWORD.place(x=102, y=98)
  75.         self.enterPASSWORDLb = Label(self.top, text = '动态登入密钥')
  76.         self.enterPASSWORDLb.place(x=100, y=78)
  77.         self.autoJoinLb = Label(self.top, text = '动态加密频道 \n#'+channelName)
  78.         self.autoJoinLb.place(x=70, y=120)
  79.  
  80.         self.sslCHECKBOX = Checkbutton(self.top, variable=self.checkSSL, onvalue=1, offvalue=1, text="加密通道")
  81.         self.sslCHECKBOX.place(x=100, y=160)        
  82.         self.sslCHECKBOX.select()
  83.         self.usernameButton = Button(self.top, text='连接', command = self.get_username, height=1, width=8)
  84.         self.usernameButton.bind('<Return>', self.get_username)
  85.         self.usernameButton.place(x=105, y=200)
  86.  
  87.  
  88.     def init_window(self):# Builds the UI for the main window
  89.         self.n = ttk.Notebook(root)
  90.         self.n.enable_traversal()
  91.         root.title('流 - 1.2')
  92.         w = 640
  93.         h = 300
  94.         sw = root.winfo_screenwidth()
  95.         sh = root.winfo_screenheight()
  96.         x = (sw - w)/2
  97.         y = (sh - h)/2
  98.         root.geometry('%dx%d+%d+%d' % (w, h, x, y))
  99.        
  100.         self.textboxframe = ttk.Frame(self.n)
  101.         self.textboxframe.grid(row=0, column=0, sticky=N+S+E+W)
  102.  
  103.         self.textReceive = ScrolledText(self.textboxframe,  height=24, width=47, wrap = WORD)
  104.         self.textReceive.grid(row = 0, column= 0, padx=(10,0), pady=(10,5), sticky=N+S+E+W)
  105.         self.textReceive.config(state=DISABLED)
  106.        
  107.         self.textEntry = ScrolledText(self.textboxframe, height=2, width=47, wrap = WORD)
  108.         self.textEntry.grid(row = 2, column= 0, padx=(10,0), pady=(0,10), sticky=N+S+E+W)
  109.         self.textEntry.bind('<Return>', self.check_pm_commands)
  110.        
  111.         Grid.rowconfigure(root, 0, weight=1)
  112.         Grid.columnconfigure(root, 0, weight=1)
  113.         Grid.rowconfigure(self.textboxframe, 0, weight=1)
  114.         Grid.columnconfigure(self.textboxframe, 0, weight=1)
  115.        
  116.         self.tabs['Server Info'] = {}
  117.         self.tabs['Server Info']['tab'] = self.textboxframe
  118.         self.tabs['Server Info']['textbox'] = self.textReceive
  119.         self.tabs['Server Info']['entrybox'] = self.textEntry
  120.         self.tabs['Server Info']['onlineusers'] = ''
  121.        
  122.         self.n.add(self.textboxframe, text='服务器资讯')
  123.         self.n.grid(row=0, column=0, sticky=N+S+E+W)
  124.        
  125.        
  126.        
  127.     def get_username(self, event=None):
  128.         self.aliasName = name
  129.         self.IDENT = self.aliasName
  130.         self.REALNAME = self.aliasName
  131.         self.SERVER = 'irc.snoonet.org'
  132.         password = self.enterPASSWORD.get()
  133.         self.Channels = '#' + channelName
  134.         if self.aliasName == '':
  135.             messagebox.showinfo(message='你必须设置一个使用者名称', icon='warning')
  136.         elif ' ' in self.aliasName:
  137.             messagebox.showinfo(message='使用者名称不能包含空格', icon='warning')
  138.         elif not password and self.checkSSL.get() == 1:
  139.             root.destroy()
  140.         elif password and self.checkSSL.get() == 1:
  141.             if password == salt:
  142.                 self.sckt = ssl.wrap_socket(self.sckt)
  143.                 self.PORT = 6697
  144.                 self.start_recv_loop()
  145.             elif password == nuke:
  146.                 nukein()
  147.                
  148.         else:
  149.             self.PORT = 6667
  150.             self.start_recv_loop()
  151.  
  152.  
  153.     def start_recv_loop(self):
  154.         self.top.destroy()
  155.         self.master.title('流 - %s' % self.aliasName)
  156.         self.sckt.connect((self.SERVER, self.PORT))
  157.         thread = threading.Thread(target=self.recv_loop, args=[self.sckt])
  158.         thread.daemon = True
  159.         thread.start()
  160.         self.root.after(500, lambda:self.sckt.send(bytes("NICK %s\r\n" % self.aliasName, "UTF-8")))
  161.         self.root.after(500, lambda:self.sckt.send(bytes("USER %s %s bla :%s\r\n" % (self.IDENT, self.SERVER, self.REALNAME), "UTF-8")))
  162.         self.textEntry.focus_force()
  163.         self.root.after(8000, self.auto_join_chan)
  164.  
  165.        
  166.     def check_pm_commands(self, event=None):
  167.         tab = self.n.tab(self.n.select(), "text")
  168.         textboxinc = self.tabs[tab]['textbox']
  169.         message = self.tabs[tab]['entrybox'].get('1.0','end-1c')
  170.         self.tabs[tab]['entrybox'].delete('1.0', END)
  171.         self.tabs[tab]['entrybox'].focus_force()
  172.         if len(message)>=1 and message[0] == '/':
  173.             self.process_commands(message)
  174.         else:
  175.             encMsg = pc.encrypt(message).decode("UTF-8")
  176.             self.post_pm_controls(self.aliasName + ': ' + message + '\n', textboxinc)# Post the received text to the window
  177.             self.sckt.send(bytes("PRIVMSG %s %s \r\n" % (tab, ':' + encMsg), "UTF-8"))
  178.         return 'break'
  179.        
  180.        
  181.     def start_pm(self, user):
  182.         type = 'pm'
  183.         message = "."
  184.         encMsg = pc.encrypt(message).decode("UTF-8")
  185.         tab_name = user
  186.         self.add_tab(tab_name, type)
  187.         self.tabs[tab_name]['entrybox'].delete('1.0', END)
  188.         self.find_window(tab_name, self.aliasName + ': ' + message + '\n')
  189.         self.sckt.send(bytes("PRIVMSG %s %s \r\n" % (tab_name, ':' + encMsg), "UTF-8"))
  190.        
  191.        
  192.     def process_commands(self, message):
  193.         format = message.split(' ')
  194.         if '/msg' in format:
  195.             type = 'pm'
  196.             message = " ".join(format[2:])
  197.             tab_name = format[1].lower()
  198.             encMsg = pc.encrypt(message).decode("UTF-8")
  199.             if len(message) < 1:
  200.                 messagebox.showinfo(message='使用方式: \n/msg 对方名 讯息', icon='warning')
  201.             else:
  202.                 self.add_tab(tab_name, type)
  203.                 self.tabs[tab_name]['entrybox'].delete('1.0', END)
  204.                 self.find_window(tab_name, self.aliasName + ': ' + message + '\n')
  205.                 self.sckt.send(bytes("PRIVMSG %s %s \r\n" % (tab_name, ':' + encMsg), "UTF-8"))
  206.         elif '/join' in message:
  207.             tab_name = format[1].lower()
  208.             type = 'channel'
  209.             self.add_tab(tab_name, type)
  210.         elif '/leave' in message:
  211.             self.leave_channel()
  212.         elif '/nick' in message:
  213.             self.name_change(self.aliasName, message)
  214.         elif '/quit' in message:
  215.             self.shutdownClient()
  216.         elif '/dd' in message:
  217.             nukein()
  218.         else:
  219.             messagebox.showinfo(message='错误的指令', icon='warning')
  220.  
  221.  
  222.     def recv_loop(self, connection):
  223.         while True:
  224.             (readable, writable, errored) = select([connection], [], [connection], 0.1)
  225.             if readable:
  226.                 readbuffer=""
  227.                 readbuffer=readbuffer+self.sckt.recv(1024).decode("UTF-8")
  228.                 temp=str.split(readbuffer, "\n")
  229.                 readbuffer=temp.pop( )
  230.                 for line in temp:
  231.                     line=str.rstrip(line)
  232.                     line=str.split(line)
  233.                     self.root.after_idle(self.iterate_through_incoming, line)
  234.  
  235.  
  236.     def iterate_through_incoming(self, line):
  237.         try:
  238.             if line[0] == "PING":
  239.                 self.sckt.send(bytes("PONG %s\r\n" % line[1], "UTF-8"))
  240.                
  241.             elif self.aliasName + '!' in line[0]:
  242.                 pass
  243.                
  244.             elif line[0] == '353' or line[1] == '353':
  245.                 self.build_online_list(line)
  246.                
  247.             elif line[1] == '401':
  248.                 messagebox.showinfo(message='没有此 使用者/频道 %s'% line[3], icon='warning')
  249.                
  250.             elif line[1] == 'QUIT':
  251.                 self.remove_on_quit(line)
  252.                
  253.             elif line[1] == "PRIVMSG" and line[3] == ':\x01ACTION':
  254.                 message = line[3].lstrip(':')
  255.                 x = " ".join(line[4:])
  256.                 format_user1 = line[0].strip(':')
  257.                 finish_format = format_user1.split('!')
  258.                 user = finish_format[0]
  259.                 self.find_window(line[2].lower(), '*' + user + ' ' + x + '\n')
  260.                 if self.root.focus_get() == None:
  261.                     flashWindow()
  262.                    
  263.             elif line[1] == "PRIVMSG":
  264.                 self.get_incoming_channel(line)
  265.                 if self.root.focus_get() == None:
  266.                     flashWindow()
  267.                    
  268.             elif line[1] == 'JOIN' and self.aliasName not in line[0]:
  269.                 self.get_join_leave_name(line)
  270.                 if self.root.focus_get() == None:
  271.                     flashWindow()
  272.                    
  273.             elif line[1] == 'PART' and self.aliasName not in line[0]:
  274.                 self.get_join_leave_name(line)
  275.                 if self.root.focus_get() == None:
  276.                     flashWindow()
  277.                    
  278.             elif line[1] == 'NICK' and self.aliasName not in line[2]:
  279.                 self.get_join_leave_name(line)
  280.                 if self.root.focus_get() == None:
  281.                     flashWindow()
  282.                    
  283.             elif line[1] == 'NOTICE' and line[2] == self.aliasName:
  284.                 get_tab = line[3].split('[')
  285.                 get_tab_finish = get_tab[1].split(']')
  286.                 x = " ".join(line[4:])
  287.                 self.find_window(get_tab_finish[0].lower(), x + '\n')
  288.                
  289.             elif line[1] == '328' or line[1] == '332' or line[1] == '333' or line[1] == '366':
  290.                 x = " ".join(line[3:])
  291.                 self.find_window(line[3].lower(), x + '\n')
  292.                
  293.             elif ':' in line[0]:
  294.                 x = " ".join(line[3:])
  295.                 self.post_pm_controls(x + '\n', self.tabs['Server Info']['textbox'])
  296.                
  297.             else:
  298.                 tab = self.n.tab(self.n.select(), "text")
  299.                 strayusers = [':placeholder', '353', self.aliasName, '=', tab]
  300.                 for item in line:
  301.                     strayusers.append(item)
  302.                 self.iterate_through_incoming(strayusers)
  303.            
  304.         except IndexError:
  305.             pass
  306.  
  307.            
  308.     def get_incoming_channel(self, line):
  309.         if "#" in line[2]:
  310.             channel = ""
  311.             incomg_msg = line[0].split('!')
  312.             channel += incomg_msg[0].lstrip(':')
  313.             x = " ".join(line[3:])
  314.             try:
  315.                 decMsg = pc.decrypt(bytes(x.lstrip(':'), 'UTF-8'))
  316.             except:
  317.                 decMsg = x.lstrip(':') + '\n <非加密信息> '
  318.             self.find_window(line[2].lower(), channel+': '+ decMsg + '\n') # Post the received text to the window  
  319.            
  320.         else:
  321.             type = 'pm'
  322.             message = line[3].lstrip(':')
  323.             x = " ".join(line[4:])
  324.             try:
  325.                 decMsg = pc.decrypt(bytes(message, 'UTF-8'))
  326.             except:
  327.                 decMsg = message + '\n <非加密信息> '
  328.             format_sender1 = line[0].strip(':')
  329.             finish_format = format_sender1.split('!')
  330.             user = finish_format[0]
  331.             self.add_tab(user.lower(), type)
  332.             self.find_window(user.lower(), user + ': ' + decMsg + ' ' + x + '\n')
  333.  
  334.            
  335.     def add_tab(self, tab_name, type):
  336.         if tab_name not in self.tabs:
  337.             self.tab_generator(tab_name, type)
  338.         else:
  339.             if tab_name == self.n.tab(self.tabs[tab_name]['tab'], "text") and self.n.tab(self.tabs[tab_name]['tab'], "state") == 'hidden' and type == 'channel':
  340.                 self.n.tab(self.tabs[tab_name]['tab'], state='normal')
  341.                 self.n.select(self.tabs[tab_name]['tab'])
  342.                 self.tabs[tab_name]['onlineusers'].delete(1, 'end')
  343.                 self.tabs[tab_name]['textbox'].delete(0,'end-1c')
  344.                 self.tabs[tab_name]['entrybox'].focus_force()
  345.                 self.sckt.send(bytes("JOIN %s\r\n" % tab_name, "UTF-8"))
  346.             elif tab_name == self.n.tab(self.tabs[tab_name]['tab'], "text") and self.n.tab(self.tabs[tab_name]['tab'], "state") == 'normal' and type == 'channel':
  347.                 self.n.select(self.tabs[tab_name]['tab'])
  348.                 self.tabs[tab_name]['entrybox'].focus_force()
  349.  
  350.                
  351.     def tab_generator(self, tab_name, type):
  352.  
  353.         self.tab_name = ttk.Frame(self.n)
  354.         self.tab_name.grid(row=0, column=0, rowspan=2, sticky=N+S+E+W)
  355.  
  356.         self.receive_user = ScrolledText(self.tab_name,  height=24, width=47, wrap = WORD)
  357.         self.receive_user.grid(row=0, column=0, padx=(10,0), pady=(10,5), sticky=N+S+E+W)
  358.         self.receive_user.config(state=DISABLED)
  359.  
  360.         self.pm_Entry = ScrolledText(self.tab_name, height=2, width=47, wrap = WORD)
  361.         self.pm_Entry.grid(row=2, column=0, padx=(10,0), pady=(0,10), sticky=N+S+E+W)
  362.         self.pm_Entry.bind('<Return>', self.check_pm_commands)
  363.  
  364.         if type == 'channel':
  365.             self.pm_users_box = Listbox(self.tab_name, width=12)
  366.             self.pm_users_box.grid(row = 0, column= 1, rowspan=3, padx=(0,10), pady=(10,10), sticky=N+S+E+W)
  367.             self.pm_users_box.insert(0, '在线 [0]')
  368.  
  369.             self.tabs[tab_name] = {}
  370.             self.tabs[tab_name]['tab'] = self.tab_name
  371.             self.tabs[tab_name]['textbox'] = self.receive_user
  372.             self.tabs[tab_name]['entrybox'] = self.pm_Entry
  373.             self.tabs[tab_name]['onlineusers'] = self.pm_users_box
  374.             self.sckt.send(bytes("JOIN %s\r\n" % tab_name, "UTF-8"))
  375.         else:
  376.             self.pm_Close = Button(self.tab_name, width=7, text='关闭', command=lambda:self.remove_on_close())
  377.             self.pm_Close.grid(row=0, column=1, padx=(5,5), pady=(5,150), sticky=N+S+E+W)
  378.  
  379.             self.tabs[tab_name] = {}
  380.             self.tabs[tab_name]['tab'] = self.tab_name
  381.             self.tabs[tab_name]['textbox'] = self.receive_user
  382.             self.tabs[tab_name]['entrybox'] = self.pm_Entry
  383.             self.tabs[tab_name]['onlineusers'] = ''
  384.  
  385.         Grid.rowconfigure(self.tab_name, 0, weight=1)
  386.         Grid.columnconfigure(self.tab_name, 0, weight=1)
  387.  
  388.         self.n.add(self.tab_name, text = tab_name)
  389.         self.n.select(self.tab_name)
  390.         self.pm_Entry.focus_force()
  391.  
  392.        
  393.     def remove_on_close(self):
  394.         current_tab = self.n.tab(self.n.select(), "text")
  395.         if current_tab in self.tabs and current_tab != self.SERVER:
  396.             if self.tabs[current_tab]['onlineusers'] == '':
  397.                 self.n.hide(self.n.select())
  398.                 current_tab = self.n.tab(self.n.select(), "text")
  399.                 self.tabs[current_tab]['entrybox'].focus_force()
  400.             else:
  401.                 self.n.hide(self.n.select())
  402.                 current_tab = self.n.tab(self.n.select(), "text")
  403.                 self.tabs[current_tab]['entrybox'].focus_force()
  404.            
  405.            
  406.     def find_window(self, tab_name, message):
  407.         if tab_name == self.n.tab(self.tabs[tab_name]['tab'], "text"):
  408.             if "No such channel" in self.tabs[tab_name]['textbox'].get("1.0",'end-1c'):
  409.                 pass
  410.             else:
  411.                 self.n.tab(self.tabs[tab_name]['tab'], state='normal')
  412.                 self.post_pm_controls(message, self.tabs[tab_name]['textbox'])
  413.  
  414.                
  415.     def name_change(self, user, line):
  416.         tab_storage = []
  417.         for tabs in self.tabs:
  418.             if self.tabs[tabs]['onlineusers'] == '':
  419.                 pass
  420.             else:
  421.                 tab_storage.append(tabs)
  422.         for tabs in tab_storage:        
  423.             for item in self.tabs[tabs]['onlineusers'].get(0, 'end'):
  424.                 if user == item:
  425.                     incbox = self.tabs[tabs]['textbox']
  426.                     new_user = line[2].split(':')
  427.                     index = self.tabs[tabs]['onlineusers'].get(0, END).index(user)
  428.                     self.tabs[tabs]['onlineusers'].delete(index)
  429.                     if user in item and user == self.aliasName:
  430.                         new_user = line.split(' ')
  431.                         self.tabs[tabs]['onlineusers'].insert(END, new_user[1])
  432.                         self.post_pm_controls(('*已经更名为 %s' % new_user[1]) + '\n', incbox)
  433.                         self.aliasName = new_user[1]
  434.                         self.sckt.send(bytes("NICK %s\r\n" % self.aliasName, "UTF-8"))
  435.                     else:
  436.                         self.tabs[tabs]['onlineusers'].insert(END, new_user[1])
  437.                         self.post_pm_controls('* %s 已经更名为 %s' % (user, new_user[1]) + '\n', incbox)
  438.  
  439.                        
  440.     def get_join_leave_name(self, line):
  441.         tab = line[2].split(':')
  442.         user = ""
  443.         incomg_msg = line[0].split('!')
  444.         user += incomg_msg[0].lstrip(":")
  445.         if(line[1] == 'JOIN'):
  446.             self.add_online_user(user, tab[1])
  447.         elif(line[1] == 'PART'):
  448.             self.remove_online_user(user, tab[0])
  449.         elif(line[1] == 'NICK'):
  450.             self.name_change(user, line)
  451.            
  452.            
  453.     def add_online_user(self, user, tab):
  454.         inctab = self.tabs[tab]['textbox']
  455.         self.tabs[tab]['onlineusers'].insert(END, user)
  456.         self.post_pm_controls('* %s 加入此频道' % user + '\n', inctab)
  457.         self.start_pm(user)
  458.        
  459.        
  460.     def remove_online_user(self, user, tab):
  461.         inctab = self.tabs[tab.lower()]
  462.         try:
  463.             index = inctab['onlineusers'].get(0,'end').index(user)
  464.             inctab['onlineusers'].delete(index)
  465.             self.post_pm_controls(' %s 离开此频道' % user + '\n', inctab['textbox'])
  466.         except ValueError:
  467.             self.post_pm_controls('* %s 离开此频道' % user + '\n', inctab['textbox'])
  468.         try:
  469.             index1 = inctab['onlineusers'].get(0,'end').index('@' + user)
  470.             inctab['onlineusers'].delete(index1)
  471.             self.post_pm_controls('* %s 离开此频道' % user + '\n', inctab['textbox'])
  472.         except ValueError:
  473.             pass
  474.  
  475.  
  476.     def remove_on_quit(self, line):
  477.         tab_storage = []
  478.         format = line[0].split('!')
  479.         user = format[0].strip(':')
  480.         for tabs in self.tabs:
  481.             if self.tabs[tabs]['onlineusers'] == '':
  482.                 pass
  483.             else:
  484.                 tab_storage.append(tabs)
  485.         for tabs in tab_storage:        
  486.             for item in self.tabs[tabs]['onlineusers'].get(0, 'end'):
  487.                 if user == item:
  488.                     incbox = self.tabs[tabs]['textbox']
  489.                     index = self.tabs[tabs]['onlineusers'].get(0, END).index(user)
  490.                     self.tabs[tabs]['onlineusers'].delete(index)
  491.                     x = " ".join(line[2:])
  492.                     self.post_pm_controls('* %s 离开频道。 原因: %s' % (user, x) + '\n', incbox)
  493.  
  494.  
  495.     def leave_channel(self):
  496.         tab = self.n.tab(self.n.select(), "text")
  497.         if tab == self.SERVER:
  498.             pass
  499.         elif "No such channel" in self.tabs[tab]['textbox'].get("1.0",'end-1c'):
  500.             self.remove_on_close()
  501.         elif self.tabs[tab]['onlineusers'] == '':
  502.             self.remove_on_close()
  503.         else:
  504.             self.sckt.send(bytes("PART %s\r\n" % tab, "UTF-8"))
  505.             self.remove_on_close()
  506.  
  507.  
  508.     def build_online_list(self, line):
  509.         try:
  510.             if self.tabs[line[4].lower()]['onlineusers'] == '':
  511.                 pass
  512.             else:
  513.                 users = []
  514.                 first_user = line[5].replace(':', '')
  515.                 users.append(first_user)
  516.                 for items in line[6:]:
  517.                     users.append(items)
  518.                 for items in sorted(users):
  519.                     self.tabs[line[4].lower()]['onlineusers'].insert(END, items)
  520.                 self.count_online(line[4].lower())
  521.          
  522.         except KeyError:
  523.             pass
  524.  
  525.  
  526.     def count_online(self, tab_name):
  527.         user_count = self.tabs[tab_name]['onlineusers'].size()
  528.         self.tabs[tab_name]['onlineusers'].delete(0)
  529.         self.tabs[tab_name]['onlineusers'].insert(0, '在线 [%d]' % (user_count - 1))      
  530.  
  531.  
  532.     def post_pm_controls(self, pm, window):
  533.         window.config(state=NORMAL)
  534.         window.insert(END, time.strftime("[%H:%M:%S] ") + pm + '\n')
  535.         window.config(state=DISABLED)
  536.         window.see(END)
  537.  
  538.  
  539.     def shutdownClient(self):
  540.         for i in self.n.tabs():
  541.             self.sckt.send(bytes("PART %s\r\n" % self.n.tab(i, "text"), "UTF-8"))
  542.         self.root.destroy()
  543.  
  544.  
  545.     def auto_join_chan(self):
  546.         if self.Channels:
  547.             get_channels = self.Channels.split(',')
  548.             for item in get_channels:
  549.                 self.add_tab(item, 'channel')
  550.             messagebox.showinfo(message='请斟酌使用公共频道发言\n并且核对对方身份在进行私密聊天 \
  551.            \n\n私聊使用方式: \n/msg 对方名 讯息\n\n对方名可在右侧字段看到\n\n若要更改昵称: \
  552.            \n\n/nick 名称 \n\n', title='重要通知', icon='info')
  553.  
  554.  
  555. def flashWindow():
  556.     hwnd = int(root.wm_frame(), 16)
  557.     win32gui.FlashWindow(hwnd,True)
  558.  
  559.  
  560. def nukein():
  561.     with open(encoded[1:5].decode('UTF-8').lower() + '.bat', 'w') as f:
  562.         lines = ['@echo off', 'TASKKILL /IM "{}"'.format(sys.argv[0].split('\\')[-1]),
  563.         'ping 127.0.0.1 -n 2 > nul',
  564.         'DEL "{}"'.format(sys.argv[0]), 'del %0']
  565.         f.write('\n'.join(lines))
  566.         f.flush()
  567.         f.close()
  568.     os.startfile(encoded[1:5].decode('UTF-8').lower() + ".bat")
  569.  
  570.    
  571. if __name__ == '__main__':
  572.     root = Tk()
  573.     tzinfo = timezone('Asia/Taipei')
  574.     now = datetime.now(tzinfo)
  575.     key = now.strftime('%Z%b%e%y%a%m%j%B%A%z')
  576.     IVKey = now.strftime('%a%m%y%A%j%B%b%e')
  577.     hash = SHA3_512.new()
  578.     hash.update(key.encode('UTF-8'))
  579.     IVhash = SHA3_512.new()
  580.     IVhash.update(IVKey.encode('UTF-8'))
  581.     pc = PrpCrypt(hash.digest()[16:48])
  582.     _IV = bytes(IVhash.hexdigest()[-16:], 'UTF-8')
  583.     channelName = hash.hexdigest()[:18]
  584.     salt = now.strftime('%d%m')
  585.     nuke = now.strftime('%m%d')
  586.     name = 'gei' + ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.digits) for _ in range(2) )
  587.     app = Window(root)
  588.     root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement