Advertisement
Guest User

Untitled

a guest
Jun 13th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.42 KB | None | 0 0
  1. #!/usr/bin/python3.4
  2. # Imports ---------------------------------------------------- #
  3. import pygame, sys, random, time, webbrowser, os, threading, socket, win32clipboard
  4. from datetime import datetime
  5. # Thread Setup ----------------------------------------------- #
  6. global active_username, active_channel
  7. active_username = 'usorename'
  8. password = 'definitelynotmypassword'
  9. active_channel = '#alakajam'
  10. server = 'irc.afternet.org'
  11. hostname = 'smething'
  12. realname = 'John Doe'
  13. global received_msgs
  14. received_msgs = []
  15. global logged_in
  16. logged_in = 0
  17. global running
  18. running = True
  19. # Connection Thread ------------------------------------------ #
  20. def handle_messages(irc):
  21.     return_value = ''
  22.     try:
  23.         text = irc.recv(2048)
  24.         text = text.decode('UTF-8')
  25.         return_value = text
  26.         messages = []
  27.         current_message_parts = []
  28.         current = ''
  29.         for char in text:
  30.             if char != '\n':
  31.                 if (char != ' ') and (char != '\r'):
  32.                     current += char
  33.                 else:
  34.                     current_message_parts.append(current)
  35.                     current = ''
  36.             else:
  37.                 messages.append(current_message_parts)
  38.                 current_message_parts = []
  39.         for message in messages:
  40.             try:
  41.                 if message[0] == 'PING':
  42.                     send = 'PONG ' + message[-1] + '\r\n'
  43.                     irc.send(bytes(send,'UTF-8'))
  44.                 elif message[-3] == '/QUOTE':
  45.                     send = '/QUOTE PONG ' + message[-1] + '\r\n'
  46.                     irc.send(bytes(send,'UTF-8'))
  47.             except:
  48.                 pass
  49.         messages = []
  50.     except:
  51.         pass
  52.     return return_value
  53.  
  54. def connection(name,password,channel,server,hostname,realname):
  55.     global received_msgs, irc, responses, logged_in, running
  56.     responses = []
  57.     irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  58.     irc.connect((server,6667))
  59.     irc.setblocking(False)
  60.     time.sleep(0.5)
  61.     irc.send(bytes('PASS ' + password + '\n', 'UTF-8'))
  62.     received_msgs.append('sent PASS...')
  63.     time.sleep(0.5)
  64.     responses.append(handle_messages(irc))
  65.     irc.send(bytes('NICK ' + name + '\n', 'UTF-8'))
  66.     received_msgs.append('sent NICK...')
  67.     time.sleep(0.5)
  68.     responses.append(handle_messages(irc))
  69.     irc.send(bytes('USER ' + name + ' ' + hostname + ' ' + server + ' :' + realname + '\n', 'UTF-8'))
  70.     received_msgs.append('sent USER...')
  71.     time.sleep(0.5)
  72.     responses.append(handle_messages(irc))
  73.     irc.send(bytes('JOIN ' + channel + '\n', 'UTF-8'))
  74.     received_msgs.append('sent JOIN...')
  75.     while True:
  76.         time.sleep(0.05)
  77.         if logged_in < 40:
  78.             logged_in += 1
  79.         responses.append(handle_messages(irc))
  80.         if running == False:
  81.             break
  82.  
  83. threads = []
  84. threads.append(threading.Thread(target = connection, args=(active_username,password,active_channel,server,hostname,realname,)))
  85. for thread in threads:
  86.     thread.start()
  87. # Setup pygame/window ---------------------------------------- #
  88. mainClock = pygame.time.Clock()
  89. from pygame.locals import *
  90. pygame.init()
  91. pygame.display.set_caption('IRC client')
  92. WINDOWWIDTH = 800
  93. WINDOWHEIGHT = 500
  94. screen = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT),0,32)
  95. # Font ------------------------------------------------------- #
  96. consolas_font = pygame.font.SysFont('consolas',12)
  97. # Global Variables ------------------------------------------- #
  98. global message_width, active_font, text_color, background_color, message_index, messages, autoscroll, scroll, slow_mode
  99. message_width = 800
  100. active_font = consolas_font
  101. text_color = (255,255,255)
  102. background_color = (0,17,32)
  103. messages = []
  104. message_index = []
  105. autoscroll = False
  106. scroll = 0
  107. slow_mode = False
  108. # Classes ---------------------------------------------------- #
  109. class message(object):
  110.     def __init__(self,text,username):
  111.         self.base_text = text
  112.         self.username = username
  113.         self.timestamp = time.localtime(time.time())
  114.         self.timestamp_str = '[' + num_str(self.timestamp.tm_hour) + ':' + num_str(self.timestamp.tm_min) + ']'
  115.         if self.username != 'client':
  116.             self.raw_text = self.timestamp_str + ' <' + self.username + '> ' + self.base_text
  117.         else:
  118.             self.raw_text = self.timestamp_str + self.base_text
  119.         self.height = None
  120.         self.lines = []
  121.         self.render_info()
  122.     def render_info(self):
  123.         global message_width, active_font
  124.         chars_per_line = int(message_width/get_font_size(active_font)[0])
  125.         line_height = get_font_size(active_font)[1]
  126.         text_left = self.raw_text
  127.         lines = []
  128.         while text_left != '':
  129.             line = text_left[:chars_per_line]
  130.             if len(line) >= chars_per_line:
  131.                 last_space_pos = last_space(line)
  132.             else:
  133.                 last_space_pos = len(line)
  134.             lines.append(line[:last_space_pos+1])
  135.             text_left = text_left[last_space_pos+1:]
  136.         self.lines = lines.copy()
  137.         self.height = line_height * len(lines)
  138.     def render(self):
  139.         global message_width, active_font, text_color, background_color, active_username
  140.         font_height = get_font_size(active_font)[1]
  141.         surf = pygame.Surface((message_width,self.height+font_height))
  142.         surf.fill(background_color)
  143.         y = 0
  144.         c = text_color
  145.         if self.base_text.lower().find(active_username.lower()) != -1:
  146.             if self.username != 'client':
  147.                 c = (3,255,27)
  148.         for line in self.lines:
  149.             surf.blit(active_font.render(line,True,c),(0,y))
  150.             y += font_height
  151.         return surf
  152. # Functions -------------------------------------------------- #
  153. def t2l(Text,Divider,intmode=False):
  154.     List = []
  155.     Current = ''
  156.     for char in Text:
  157.         if char != Divider:
  158.             Current += char
  159.         else:
  160.             if intmode == True:
  161.                 try:
  162.                     List.append(int(Current))
  163.                 except:
  164.                     List.append(Current)
  165.             else:
  166.                 List.append(Current)
  167.             Current = ''
  168.     if Current != '':
  169.         if intmode == True:
  170.             try:
  171.                 List.append(int(Current))
  172.             except:
  173.                 List.append(Current)
  174.         else:
  175.             List.append(Current)
  176.     return List
  177. def get_font_size(font):
  178.     return font.size('a')
  179. def last_space(text):
  180.     for i in range(len(text)):
  181.         char_num = len(text)-i-1
  182.         char = text[char_num]
  183.         if char == ' ':
  184.             return char_num
  185.     return len(text)
  186. def add_message(text,username):
  187.     global message_index, messages, autoscroll, scroll
  188.     messages.append(message(text,username))
  189.     message_num = len(messages)-1
  190.     for i in range(len(messages[-1].lines)):
  191.         if i != 0:
  192.             message_index.append(None)
  193.         else:
  194.             message_index.append(message_num)
  195.     if autoscroll == True:
  196.         scroll += len(messages[-1].lines)
  197. def num_str(number):
  198.     if number < 10:
  199.         return '0' + str(number)
  200.     else:
  201.         return str(number)
  202. def send_message(text,channel):
  203.     global active_username
  204.     add_message(text,active_username)
  205.     if text[0] != '/':
  206.         msg = 'PRIVMSG ' + channel + ' :' + text + '\r\n'
  207.     else:
  208.         msg = text[1:]
  209.         msg = msg[:msg.find(' ')].upper() + msg[msg.find(' '):] + '\r\n'
  210.     print('sent: ' + msg)
  211.     send_irc(msg)
  212. def send_irc(text):
  213.     global irc
  214.     irc.send(bytes(text, 'UTF-8'))
  215. def read_clipboard():
  216.     win32clipboard.OpenClipboard()
  217.     data = win32clipboard.GetClipboardData()
  218.     win32clipboard.CloseClipboard()
  219.     return data
  220. # Variables -------------------------------------------------- #
  221. global responses
  222. add_message('beginning of log','client')
  223. message_area_height = 500
  224. cursor_pos = 0
  225. cursor_blink_timer = 0
  226. entered_text = ''
  227. characters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
  228.               '`','1','2','3','4','5','6','7','8','9','0','-','=',
  229.               '[',']',';','\'',',','.','/','\\']
  230. uppercase_characters = {'`':'~','1':'!','2':'@','3':'#','4':'$','5':'%','6':'^','7':'&','8':'*','9':'(','0':')','-':'_','=':'+',
  231.                         '[':'{',']':'}','\\':'|',';':':','\'':'"',',':'<','.':'>','/':'?'}
  232. shift = False
  233. ctrl = False
  234. backspace_hold = 0
  235. left_hold = 0
  236. right_hold = 0
  237. # Loop ------------------------------------------------------- #
  238. while True:
  239.     # Background --------------------------------------------- #
  240.     screen.fill(background_color)
  241.     slow_mode += 1
  242.     if pygame.mouse.get_focused() == True:
  243.         slow_mode = 0
  244.     # Login -------------------------------------------------- #
  245.     if logged_in == 40:
  246.         logged_in = 41
  247.         add_message(' ----------- connected -----------','client')
  248.         # log in not needed
  249.     # Handle Responses --------------------------------------- #
  250.     for response in responses:
  251.         internal_messages = t2l(response,'\n')
  252.         for m in internal_messages:
  253.             print(m)
  254.             if m[-1:] == '\r':
  255.                 m = m[:-1]
  256.             if m != '':
  257.                 if m[:4] != 'PING':
  258.                     if m.find('PRIVMSG') != -1:
  259.                         end = m[m.find('PRIVMSG'):]
  260.                         end = end[end.find(':')+1:]
  261.                         name = m[1:m.find('!')]
  262.                         add_message(end,name)
  263.                     elif m.find('JOIN') != -1:
  264.                         name = m[1:m.find('!')]
  265.                         if name != active_username:
  266.                             add_message(' ' + name + ' has joined ' + active_channel,'client')
  267.                     elif m.find('QUIT') != -1:
  268.                         name = m[1:m.find('!')]
  269.                         add_message(' ' + name + ' has left ' + active_channel,'client')
  270.                     else:
  271.                         add_message(m,'client')
  272.     responses = []
  273.     # Messages ----------------------------------------------- #
  274.     y = 0
  275.     line_height = get_font_size(active_font)[1]
  276.     char_width = get_font_size(active_font)[0]
  277.     # find last message above starting point
  278.     pos = scroll-1
  279.     while True:
  280.         if pos >= 0:
  281.             if message_index[pos] != None:
  282.                 break
  283.         else:
  284.             break
  285.         pos -= 1
  286.     if pos != -1:
  287.         screen.blit(messages[message_index[pos]].render(),(0,(pos-scroll)*line_height))
  288.     # render
  289.     shown_message_len = int(message_area_height/line_height+1)
  290.     for loc in range(shown_message_len):
  291.         pos = loc + scroll
  292.         if pos < len(message_index):
  293.             if message_index[pos] != None:
  294.                 screen.blit(messages[message_index[pos]].render(),(0,y*line_height))
  295.         y += 1
  296.     # Text Box ----------------------------------------------- #
  297.     box_surf = pygame.Surface((WINDOWWIDTH,line_height+4))
  298.     box_surf.fill(background_color)
  299.     pygame.draw.line(box_surf,text_color,(0,0),(box_surf.get_width(),0))
  300.     box_surf.blit(active_font.render(entered_text,True,text_color),(2,3))
  301.     cursor_blink_timer += 1
  302.     if cursor_blink_timer == 40:
  303.         cursor_blink_timer = 0
  304.     if cursor_blink_timer < 20:
  305.         box_surf.blit(active_font.render('|',True,text_color),(cursor_pos*char_width-1,3))
  306.     screen.blit(box_surf,(0,WINDOWHEIGHT-box_surf.get_height()))
  307.     # Autoscroll --------------------------------------------- #
  308.     if scroll == len(message_index)-shown_message_len+3:
  309.         autoscroll = True
  310.     else:
  311.         autoscroll = False
  312.     if scroll > len(message_index)-shown_message_len+3:
  313.         scroll = len(message_index)-shown_message_len+3
  314.         if scroll < 0:
  315.             scroll = 0
  316.     # Buttons ------------------------------------------------ #
  317.     for event in pygame.event.get():
  318.         if event.type == QUIT:
  319.             running = False
  320.             pygame.quit()
  321.             sys.exit()
  322.         if event.type == KEYDOWN:
  323.             slow_mode = 0
  324.             if event.key == K_LEFT:
  325.                 left_hold = 1
  326.                 if cursor_pos > 0:
  327.                     cursor_pos -= 1
  328.             if event.key == K_RIGHT:
  329.                 right_hold = 1
  330.                 if cursor_pos < len(entered_text):
  331.                     cursor_pos += 1
  332.             if event.key == K_SPACE:
  333.                 entered_text = entered_text[:cursor_pos] + ' ' + entered_text[cursor_pos:]
  334.                 cursor_pos += 1
  335.             if event.key == K_LSHIFT:
  336.                 shift = True
  337.             if event.key == K_LCTRL:
  338.                 ctrl = True
  339.             if event.key == K_RETURN:
  340.                 send_message(entered_text,active_channel)
  341.                 entered_text = ''
  342.                 cursor_pos = 0
  343.             if ctrl == False:
  344.                 for char in characters:
  345.                     if event.key == ord(char):
  346.                         new_char = ''
  347.                         if shift == False:
  348.                             new_char = char
  349.                         elif char in uppercase_characters:
  350.                             new_char = uppercase_characters[char]
  351.                         else:
  352.                             new_char = char.upper()
  353.                         entered_text = entered_text[:cursor_pos] + new_char + entered_text[cursor_pos:]
  354.                         cursor_pos += 1
  355.             elif event.key == ord('v'):
  356.                 clipboard_dat = read_clipboard()
  357.                 entered_text = entered_text[:cursor_pos] + clipboard_dat + entered_text[cursor_pos:]
  358.                 cursor_pos += len(clipboard_dat)
  359.             if event.key == K_BACKSPACE:
  360.                 backspace_hold = 1
  361.                 if entered_text != '':
  362.                     if cursor_pos > 0:
  363.                         entered_text = entered_text[:cursor_pos-1] + entered_text[cursor_pos:]
  364.                         cursor_pos -= 1
  365.         if event.type == KEYUP:
  366.             if event.key == K_BACKSPACE:
  367.                 backspace_hold = 0
  368.             if event.key == K_LEFT:
  369.                 left_hold = 0
  370.             if event.key == K_RIGHT:
  371.                 right_hold = 0
  372.             if event.key == K_LSHIFT:
  373.                 shift = False
  374.             if event.key == K_LCTRL:
  375.                 ctrl = False
  376.         if event.type == MOUSEBUTTONDOWN:
  377.             if event.button == 4:
  378.                 scroll -= 4
  379.                 if scroll < 0:
  380.                     scroll = 0
  381.             if event.button == 5:
  382.                 scroll += 4
  383.                 if scroll > len(message_index)-shown_message_len+3:
  384.                     scroll = len(message_index)-shown_message_len+3
  385.                     if scroll < 0:
  386.                         scroll = 0
  387.     if backspace_hold != 0:
  388.         backspace_hold += 1
  389.         if backspace_hold > 20:
  390.             if entered_text != '':
  391.                 if cursor_pos > 0:
  392.                     entered_text = entered_text[:cursor_pos-1] + entered_text[cursor_pos:]
  393.                     cursor_pos -= 1
  394.     if left_hold != 0:
  395.         left_hold += 1
  396.         if left_hold > 20:
  397.             if cursor_pos > 0:
  398.                 cursor_pos -= 1
  399.     if right_hold != 0:
  400.         right_hold += 1
  401.         if right_hold > 20:
  402.             if cursor_pos < len(entered_text):
  403.                 cursor_pos += 1
  404.     # Update ------------------------------------------------- #
  405.     pygame.display.update()
  406.     if slow_mode > 200:
  407.         mainClock.tick(2)
  408.     else:
  409.         mainClock.tick(40)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement