Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3.4
- # Imports ---------------------------------------------------- #
- import pygame, sys, random, time, webbrowser, os, threading, socket, win32clipboard
- from datetime import datetime
- # Thread Setup ----------------------------------------------- #
- global active_username, active_channel
- active_username = 'usorename'
- password = 'definitelynotmypassword'
- active_channel = '#alakajam'
- server = 'irc.afternet.org'
- hostname = 'smething'
- realname = 'John Doe'
- global received_msgs
- received_msgs = []
- global logged_in
- logged_in = 0
- global running
- running = True
- # Connection Thread ------------------------------------------ #
- def handle_messages(irc):
- return_value = ''
- try:
- text = irc.recv(2048)
- text = text.decode('UTF-8')
- return_value = text
- messages = []
- current_message_parts = []
- current = ''
- for char in text:
- if char != '\n':
- if (char != ' ') and (char != '\r'):
- current += char
- else:
- current_message_parts.append(current)
- current = ''
- else:
- messages.append(current_message_parts)
- current_message_parts = []
- for message in messages:
- try:
- if message[0] == 'PING':
- send = 'PONG ' + message[-1] + '\r\n'
- irc.send(bytes(send,'UTF-8'))
- elif message[-3] == '/QUOTE':
- send = '/QUOTE PONG ' + message[-1] + '\r\n'
- irc.send(bytes(send,'UTF-8'))
- except:
- pass
- messages = []
- except:
- pass
- return return_value
- def connection(name,password,channel,server,hostname,realname):
- global received_msgs, irc, responses, logged_in, running
- responses = []
- irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- irc.connect((server,6667))
- irc.setblocking(False)
- time.sleep(0.5)
- irc.send(bytes('PASS ' + password + '\n', 'UTF-8'))
- received_msgs.append('sent PASS...')
- time.sleep(0.5)
- responses.append(handle_messages(irc))
- irc.send(bytes('NICK ' + name + '\n', 'UTF-8'))
- received_msgs.append('sent NICK...')
- time.sleep(0.5)
- responses.append(handle_messages(irc))
- irc.send(bytes('USER ' + name + ' ' + hostname + ' ' + server + ' :' + realname + '\n', 'UTF-8'))
- received_msgs.append('sent USER...')
- time.sleep(0.5)
- responses.append(handle_messages(irc))
- irc.send(bytes('JOIN ' + channel + '\n', 'UTF-8'))
- received_msgs.append('sent JOIN...')
- while True:
- time.sleep(0.05)
- if logged_in < 40:
- logged_in += 1
- responses.append(handle_messages(irc))
- if running == False:
- break
- threads = []
- threads.append(threading.Thread(target = connection, args=(active_username,password,active_channel,server,hostname,realname,)))
- for thread in threads:
- thread.start()
- # Setup pygame/window ---------------------------------------- #
- mainClock = pygame.time.Clock()
- from pygame.locals import *
- pygame.init()
- pygame.display.set_caption('IRC client')
- WINDOWWIDTH = 800
- WINDOWHEIGHT = 500
- screen = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT),0,32)
- # Font ------------------------------------------------------- #
- consolas_font = pygame.font.SysFont('consolas',12)
- # Global Variables ------------------------------------------- #
- global message_width, active_font, text_color, background_color, message_index, messages, autoscroll, scroll, slow_mode
- message_width = 800
- active_font = consolas_font
- text_color = (255,255,255)
- background_color = (0,17,32)
- messages = []
- message_index = []
- autoscroll = False
- scroll = 0
- slow_mode = False
- # Classes ---------------------------------------------------- #
- class message(object):
- def __init__(self,text,username):
- self.base_text = text
- self.username = username
- self.timestamp = time.localtime(time.time())
- self.timestamp_str = '[' + num_str(self.timestamp.tm_hour) + ':' + num_str(self.timestamp.tm_min) + ']'
- if self.username != 'client':
- self.raw_text = self.timestamp_str + ' <' + self.username + '> ' + self.base_text
- else:
- self.raw_text = self.timestamp_str + self.base_text
- self.height = None
- self.lines = []
- self.render_info()
- def render_info(self):
- global message_width, active_font
- chars_per_line = int(message_width/get_font_size(active_font)[0])
- line_height = get_font_size(active_font)[1]
- text_left = self.raw_text
- lines = []
- while text_left != '':
- line = text_left[:chars_per_line]
- if len(line) >= chars_per_line:
- last_space_pos = last_space(line)
- else:
- last_space_pos = len(line)
- lines.append(line[:last_space_pos+1])
- text_left = text_left[last_space_pos+1:]
- self.lines = lines.copy()
- self.height = line_height * len(lines)
- def render(self):
- global message_width, active_font, text_color, background_color, active_username
- font_height = get_font_size(active_font)[1]
- surf = pygame.Surface((message_width,self.height+font_height))
- surf.fill(background_color)
- y = 0
- c = text_color
- if self.base_text.lower().find(active_username.lower()) != -1:
- if self.username != 'client':
- c = (3,255,27)
- for line in self.lines:
- surf.blit(active_font.render(line,True,c),(0,y))
- y += font_height
- return surf
- # Functions -------------------------------------------------- #
- def t2l(Text,Divider,intmode=False):
- List = []
- Current = ''
- for char in Text:
- if char != Divider:
- Current += char
- else:
- if intmode == True:
- try:
- List.append(int(Current))
- except:
- List.append(Current)
- else:
- List.append(Current)
- Current = ''
- if Current != '':
- if intmode == True:
- try:
- List.append(int(Current))
- except:
- List.append(Current)
- else:
- List.append(Current)
- return List
- def get_font_size(font):
- return font.size('a')
- def last_space(text):
- for i in range(len(text)):
- char_num = len(text)-i-1
- char = text[char_num]
- if char == ' ':
- return char_num
- return len(text)
- def add_message(text,username):
- global message_index, messages, autoscroll, scroll
- messages.append(message(text,username))
- message_num = len(messages)-1
- for i in range(len(messages[-1].lines)):
- if i != 0:
- message_index.append(None)
- else:
- message_index.append(message_num)
- if autoscroll == True:
- scroll += len(messages[-1].lines)
- def num_str(number):
- if number < 10:
- return '0' + str(number)
- else:
- return str(number)
- def send_message(text,channel):
- global active_username
- add_message(text,active_username)
- if text[0] != '/':
- msg = 'PRIVMSG ' + channel + ' :' + text + '\r\n'
- else:
- msg = text[1:]
- msg = msg[:msg.find(' ')].upper() + msg[msg.find(' '):] + '\r\n'
- print('sent: ' + msg)
- send_irc(msg)
- def send_irc(text):
- global irc
- irc.send(bytes(text, 'UTF-8'))
- def read_clipboard():
- win32clipboard.OpenClipboard()
- data = win32clipboard.GetClipboardData()
- win32clipboard.CloseClipboard()
- return data
- # Variables -------------------------------------------------- #
- global responses
- add_message('beginning of log','client')
- message_area_height = 500
- cursor_pos = 0
- cursor_blink_timer = 0
- entered_text = ''
- 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',
- '`','1','2','3','4','5','6','7','8','9','0','-','=',
- '[',']',';','\'',',','.','/','\\']
- uppercase_characters = {'`':'~','1':'!','2':'@','3':'#','4':'$','5':'%','6':'^','7':'&','8':'*','9':'(','0':')','-':'_','=':'+',
- '[':'{',']':'}','\\':'|',';':':','\'':'"',',':'<','.':'>','/':'?'}
- shift = False
- ctrl = False
- backspace_hold = 0
- left_hold = 0
- right_hold = 0
- # Loop ------------------------------------------------------- #
- while True:
- # Background --------------------------------------------- #
- screen.fill(background_color)
- slow_mode += 1
- if pygame.mouse.get_focused() == True:
- slow_mode = 0
- # Login -------------------------------------------------- #
- if logged_in == 40:
- logged_in = 41
- add_message(' ----------- connected -----------','client')
- # log in not needed
- # Handle Responses --------------------------------------- #
- for response in responses:
- internal_messages = t2l(response,'\n')
- for m in internal_messages:
- print(m)
- if m[-1:] == '\r':
- m = m[:-1]
- if m != '':
- if m[:4] != 'PING':
- if m.find('PRIVMSG') != -1:
- end = m[m.find('PRIVMSG'):]
- end = end[end.find(':')+1:]
- name = m[1:m.find('!')]
- add_message(end,name)
- elif m.find('JOIN') != -1:
- name = m[1:m.find('!')]
- if name != active_username:
- add_message(' ' + name + ' has joined ' + active_channel,'client')
- elif m.find('QUIT') != -1:
- name = m[1:m.find('!')]
- add_message(' ' + name + ' has left ' + active_channel,'client')
- else:
- add_message(m,'client')
- responses = []
- # Messages ----------------------------------------------- #
- y = 0
- line_height = get_font_size(active_font)[1]
- char_width = get_font_size(active_font)[0]
- # find last message above starting point
- pos = scroll-1
- while True:
- if pos >= 0:
- if message_index[pos] != None:
- break
- else:
- break
- pos -= 1
- if pos != -1:
- screen.blit(messages[message_index[pos]].render(),(0,(pos-scroll)*line_height))
- # render
- shown_message_len = int(message_area_height/line_height+1)
- for loc in range(shown_message_len):
- pos = loc + scroll
- if pos < len(message_index):
- if message_index[pos] != None:
- screen.blit(messages[message_index[pos]].render(),(0,y*line_height))
- y += 1
- # Text Box ----------------------------------------------- #
- box_surf = pygame.Surface((WINDOWWIDTH,line_height+4))
- box_surf.fill(background_color)
- pygame.draw.line(box_surf,text_color,(0,0),(box_surf.get_width(),0))
- box_surf.blit(active_font.render(entered_text,True,text_color),(2,3))
- cursor_blink_timer += 1
- if cursor_blink_timer == 40:
- cursor_blink_timer = 0
- if cursor_blink_timer < 20:
- box_surf.blit(active_font.render('|',True,text_color),(cursor_pos*char_width-1,3))
- screen.blit(box_surf,(0,WINDOWHEIGHT-box_surf.get_height()))
- # Autoscroll --------------------------------------------- #
- if scroll == len(message_index)-shown_message_len+3:
- autoscroll = True
- else:
- autoscroll = False
- if scroll > len(message_index)-shown_message_len+3:
- scroll = len(message_index)-shown_message_len+3
- if scroll < 0:
- scroll = 0
- # Buttons ------------------------------------------------ #
- for event in pygame.event.get():
- if event.type == QUIT:
- running = False
- pygame.quit()
- sys.exit()
- if event.type == KEYDOWN:
- slow_mode = 0
- if event.key == K_LEFT:
- left_hold = 1
- if cursor_pos > 0:
- cursor_pos -= 1
- if event.key == K_RIGHT:
- right_hold = 1
- if cursor_pos < len(entered_text):
- cursor_pos += 1
- if event.key == K_SPACE:
- entered_text = entered_text[:cursor_pos] + ' ' + entered_text[cursor_pos:]
- cursor_pos += 1
- if event.key == K_LSHIFT:
- shift = True
- if event.key == K_LCTRL:
- ctrl = True
- if event.key == K_RETURN:
- send_message(entered_text,active_channel)
- entered_text = ''
- cursor_pos = 0
- if ctrl == False:
- for char in characters:
- if event.key == ord(char):
- new_char = ''
- if shift == False:
- new_char = char
- elif char in uppercase_characters:
- new_char = uppercase_characters[char]
- else:
- new_char = char.upper()
- entered_text = entered_text[:cursor_pos] + new_char + entered_text[cursor_pos:]
- cursor_pos += 1
- elif event.key == ord('v'):
- clipboard_dat = read_clipboard()
- entered_text = entered_text[:cursor_pos] + clipboard_dat + entered_text[cursor_pos:]
- cursor_pos += len(clipboard_dat)
- if event.key == K_BACKSPACE:
- backspace_hold = 1
- if entered_text != '':
- if cursor_pos > 0:
- entered_text = entered_text[:cursor_pos-1] + entered_text[cursor_pos:]
- cursor_pos -= 1
- if event.type == KEYUP:
- if event.key == K_BACKSPACE:
- backspace_hold = 0
- if event.key == K_LEFT:
- left_hold = 0
- if event.key == K_RIGHT:
- right_hold = 0
- if event.key == K_LSHIFT:
- shift = False
- if event.key == K_LCTRL:
- ctrl = False
- if event.type == MOUSEBUTTONDOWN:
- if event.button == 4:
- scroll -= 4
- if scroll < 0:
- scroll = 0
- if event.button == 5:
- scroll += 4
- if scroll > len(message_index)-shown_message_len+3:
- scroll = len(message_index)-shown_message_len+3
- if scroll < 0:
- scroll = 0
- if backspace_hold != 0:
- backspace_hold += 1
- if backspace_hold > 20:
- if entered_text != '':
- if cursor_pos > 0:
- entered_text = entered_text[:cursor_pos-1] + entered_text[cursor_pos:]
- cursor_pos -= 1
- if left_hold != 0:
- left_hold += 1
- if left_hold > 20:
- if cursor_pos > 0:
- cursor_pos -= 1
- if right_hold != 0:
- right_hold += 1
- if right_hold > 20:
- if cursor_pos < len(entered_text):
- cursor_pos += 1
- # Update ------------------------------------------------- #
- pygame.display.update()
- if slow_mode > 200:
- mainClock.tick(2)
- else:
- mainClock.tick(40)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement