print "Event" + m def onMOTDMsg(m,cServer): IRCHelper.join(cServer,"#botplay") def onJoinMsg(m,cServer): print m.nick #IRCLibraryTesting app. print "IRCLibrary testing app 0.1" server = IRC.server() IRC.connectEvent("serverMsg",onServerMsg,server) IRC.connectEvent("onMotdMsg",onMOTDMsg,server) IRC.connectEvent("onPartMsg",onJoinMsg,server) server = IRC.connect("irc.spotchat.org","vIRC","vIRC",6667,server) print server.cNick #server2 = IRC.server() #IRC.connectEvent("serverMsg",onServerMsg,server2) #IRC.connectEvent("onMotdMsg",onMOTDMsg,server2) #server = IRC.connect("irc.freenode.net","vIRC","vIRC",8001,server2) while(True): pass
class CursesGui: def __init__(self): # our irc-object self.irc = IRC(self.update_window2) # init the screen self.scr = curses.initscr() curses.noecho() curses.cbreak() self.scr.keypad(1) # init the first window as status window y, x = self.scr.getmaxyx() self.statuswin = curses.newwin(1, x, y - 2, 0) self.statuswin.addstr(0, 0, "[NOT CONNECTED]") # staus win 2 who@where statuswin2W = 10 self.statuswin2 = curses.newwin(1, statuswin2W, y - 1, 0) self.statuswin2.addstr(0, 0, "NICK") # type win self.typewin = curses.newwin(1, x - statuswin2W - 1, y - 1, statuswin2W - 1) self.typewin.keypad(1) # message win self.messagewin = curses.newwin( y - 2, x - 13, 0, 0) # nick lengt is 9 char should be done dynamically # so that windows size should depend on nick lenghts # nick win self.nickwin = curses.newwin(y - 2, 13, 0, x - 13) # should also be dynamic self.textbuffer = EditBuffer() # edit buffer for text input # list of our window (channel) self.mwindows = list() self.active_mwindow = 0 # refresh the windows self.messagewin.refresh() self.statuswin.refresh() self.statuswin2.refresh() self.typewin.refresh() def update_status(self): # update the status bar self.statuswin.erase() chan = self.mwindows[self.active_mwindow] channelsupdated = '' for channel in self.mwindows: if channel.updated == 1: channelsupdated += " [" + str( self.mwindows.index(channel)) + "]" self.statuswin.addstr( 0, 0, '[' + chan.server + '] ' + chan.name + ' ' + str(self.mwindows.index(chan)) + ' ' + channelsupdated) def update_nickwin(self): self.nickwin.erase() chan = self.mwindows[self.active_mwindow] x = 0 maxy, maxx = self.scr.getmaxyx() maxy = (maxy - (len(self.textbuffer.lines) - 1)) for user in chan.users: self.nickwin.addstr(x, 0, user.status + user.nick) x = x + 1 if x + 3 > maxy: # break if too many nicks to fit window break self.nickwin.refresh() def resizewindows(self): numlines = ((len(self.textbuffer.lines) - 1)) if numlines < 1: numlines = 0 # numlines is according to typewin # init the first window as status window y, x = self.scr.getmaxyx() self.statuswin = curses.newwin(1, x, (y - (2 + numlines)), 0) #self.statuswin.addstr(0,0,"[NOT CONNECTED]") # staus win 2 who@where statuswin2W = 10 self.statuswin2 = curses.newwin((1 + numlines), statuswin2W, (y - (1 + numlines)), 0) self.statuswin2.addstr(0, 0, "NICK") # type win self.typewin = curses.newwin((1 + numlines), x - statuswin2W - 1, (y - (1 + numlines)), statuswin2W - 1) self.typewin.keypad(1) # message win self.messagewin = curses.newwin( (y - (2 + numlines)), x - 13, 0, 0) # nick lengt is 9 char should be done dynamically # so that windows size should depend on nick lenghts # nick win self.nickwin = curses.newwin((y - (2 + numlines)), 13, 0, x - 13) # should also be dynamic # refresh the windows self.update_window() # draw the window again def update_window(self): channel = self.mwindows[self.active_mwindow] self.draw_lines_to_message_win(channel) self.update_status() self.update_nickwin() # refresh the windows self.messagewin.refresh() self.statuswin.refresh() self.statuswin2.refresh() self.typewin.refresh() def update_window2(self, channel, network, command): if command == 'NEWWINDOW': self.mwindows.append(channel) self.active_mwindow = len(self.mwindows) - 1 elif command == 'REMOVEWINDOW': self.active_mwindow = 0 self.mwindows.remove(channel) self.update_window() elif command == 'NAMES': self.update_nickwin() # fix later if self.mwindows[self.active_mwindow] == channel: for chanwin in self.mwindows: if chanwin.name == channel.name: self.draw_lines_to_message_win(channel) else: # mark channel updated for chanwin in self.mwindows: if chanwin.name == channel.name: channel.updated = 1 self.update_status() self.update_nickwin() # refresh the windows self.messagewin.refresh() self.statuswin.refresh() self.statuswin2.refresh() self.typewin.refresh() def get_time(self, loctime): # example # strftime("%a, %d %b %Y %H:%M:%S", loctime) # 'Sun, 24 Apr 2005 13:46:24' return strftime("%H:%M", loctime) def draw_lines_to_message_win(self, channel, uplines=0): # mark that we have seen the channel channel.updated = 0 # This is f****d up. Write better when time # first clear the window self.messagewin.erase() lines = channel.lines[:(len(channel.lines) - channel.linecount)] mwy, mwx = self.messagewin.getmaxyx() currentline = 0 lines.reverse() # get the lines for lines splittedlines = list() # check the length of the time prefix prefixlength = (len(self.get_time(localtime())) + 1 ) # +1 for one space for line in lines: # if the sender is nick (it has ! in it) cut the host for now # REMEMBER TO FIX LATER nik = line.sender.find('!') if nik > 0: nikki = line.sender[0:nik] else: nikki = line.sender linetime = self.get_time(line.time) + ' ' justwords = line.text.split(' ') justwords2 = list() pituus2 = (mwx - 1 - (len(nikki) + 3 + prefixlength) ) # carefull with the parenthesis for word in justwords: x = 0 if len(word) > pituus2: while len(word[x:len(word)]) > pituus2: justwords2.append(word[x:(x + pituus2)]) x = x + pituus2 justwords2.append(word[x:len(word)]) else: justwords2.append(word) # now all the words should be nice length sline = linetime + '<' + nikki + '> ' templines = list() for word in justwords2: if len(sline) + len(word) < mwx: if len(sline) == len(nikki) + 3 + prefixlength: sline = sline + '' + word else: sline = sline + ' ' + word else: templines.append(sline) sline = linetime + '<' + nikki + '> ' + word templines.append(sline) templines.reverse() splittedlines.extend(templines) numlines = len(splittedlines) # put the splitted lines to screen for line in splittedlines: if currentline < mwy: try: self.messagewin.addstr(mwy - currentline - 1, 0, line) except: self.messagewin.addstr(mwy - currentline - 1, 0, 'FATAL ERROR') currentline = currentline + 1 else: break lines.reverse() def start(self): self.irc.connect('ORJAnet', '192.168.1.2', 6667, 'petteri', 'asd2dasv', 'dyksi') self.irc.start() currentserver = 0 self.mwindows.append(self.irc.messages) #self.irc.connect('EFnet','someseerver',6667,'pzq2','asd2dasv','dyksi',self.update_window2) pirssion = 1 # lets take some key input this just a quick method. Remember to fix later while pirssion == 1: enterpushed = 0 oldlen = 0 gotalt = 0 # for alt characters self.textbuffer.reset() while enterpushed == 0: isinlist = 0 ty, tx = self.typewin.getmaxyx() ch = self.typewin.getch(self.textbuffer.y, self.textbuffer.x) if ch > 0: if ch == 10: # enter enterpushed = 1 elif ch in (curses.KEY_PPAGE, curses.ascii.STX): # page up also ctrl-b self.mwindows[self.active_mwindow].page_up() self.update_window() ch = 0 elif ch in (curses.KEY_NPAGE, curses.ascii.EOT): # page down also ctrl-d self.mwindows[self.active_mwindow].page_down() self.update_window() ch = 0 else: name = curses.keyname(ch) if gotalt == 1: for altchar in list( '123456789'): #change the window if ch == ord(altchar): isinlist = 1 window_number = int(altchar) - 1 if len(self.mwindows) > window_number: self.active_mwindow = window_number self.update_window() ch = 0 # delete the character gotalt = 0 if name.startswith("M-") or name.startswith( "m-") or name.startswith("^["): # get alt/meta gotalt = 1 if ch > 0: lines = self.textbuffer.input(ch, ty, tx) # update the typewindow self.typewin.erase() if len(lines) != oldlen: self.resizewindows() oldlen = len(lines) linecounter = 0 wholestring = '' for line in lines: self.typewin.addstr(linecounter, 1, line) wholestring = wholestring + line linecounter = linecounter + 1 self.typewin.refresh() # enter has been pushed, back to normal window sizes self.resizewindows() #put our message to channel or status screen self.putmessagetoscreen(wholestring) self.update_window() channel = self.mwindows[self.active_mwindow].name self.irc.message(wholestring, self.mwindows[self.active_mwindow].server, channel) self.typewin.erase() curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() def putmessagetoscreen(self, inputstring): chan = self.mwindows[self.active_mwindow] # dirty hack FIX LATER try: nick = self.irc.get_server(chan.server).nick except: nick = 'pyRKKI ERROR: NOT CONNECTED' chan.add_line(IRCMessage(str(nick), 'itse', inputstring, localtime())) self.update_window()
import os import shlex import random from IRC import * from dcc import * query = raw_input("Book title: ") ## IRC Config server = "irc.irchighway.net" port = 6667 channel = "#ebooks" botnick = "bOOkbot" irc = IRC() irc.connect(server, port, channel, botnick) irc.send("#ebooks", "@search " + query) while True: text = irc.get_response() #if text.find('PRIVMSG') != -1: #see all messages, for fun # print(text) if "DCC SEND" in text: print(text) break dccString = text.split("DCC SEND ", 1)[1].replace('\x01', '') dccString = shlex.split(dccString) downloadfile(dccString)