#! /usr/bin/env python # Mucous - a curses client for museek # Based on Museekchat # # Copyright (C) 2003-2004 Hyriand # # Contributions by daelstorm (C) 2005 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import curses, sys, time, pwd, os, commands, getopt, threading import curses.wrapper import curses.textpad import select, string, re, ConfigParser from time import sleep import messages, driver #from museek from UserDict import UserDict class SortedDict(UserDict): def __init__(self): self.__keys__ = [] self.__sorted__ = True UserDict.__init__(self) def __setitem__(self, key, value): if not self.__dict__.has_key(key): self.__keys__.append(key) self.__sorted__ = False UserDict.__setitem__(self, key, value) def __delitem__(self, key): self.__keys__.remove(key) UserDict.__delitem__(self, key) def keys(self): if not self.__sorted__: self.__keys__.sort() self.__sorted__ = True return self.__keys__ def items(self): if not self.__sorted__: self.__keys__.sort() self.__sorted__ = True for key in self.__keys__: yield key, self[key] alpha_list = SortedDict() states = {} states[0] = "Finished" states[1] = "Transferring" states[2] = "Negotiating" states[3] = "Waiting" states[4] = "Establishing" states[5] = "Initiating" states[6] = "Connecting" states[7] = "Queued" states[8] = "Address" states[9] = "Status" states[10] = "Offline" states[11] = "Closed" states[12] = "Can't Connect" states[13] = "Aborted" states[14] = "Not Shared" config_dir = str(os.path.expanduser("~/.mucous/")) config_file = config_dir+"config" version = "0.4.7" def usage(): print ("""Mucous is a client for Museek, the P2P Soulseek Daemon Authors: Daelstorm & Hyriand Version: %s Default options: none -c, --config Use a different config file -v, --version Display version and quit -h, --help Display this help and exit """ %version) sys.exit(2) try: opts, args = getopt.getopt(sys.argv[1:], "hc:v", ["help", "config=", "version"]) except getopt.GetoptError: # print help information and exit: usage() sys.exit(2) for opts, args in opts: if opts in ("-h", "--help"): usage() sys.exit() if opts in ("-c", "--config"): print args config_file=str(os.path.expanduser(args)) if opts in ("-v", "--version"): print "Mucous version: %s" % version sys.exit(2) parser = ConfigParser.ConfigParser() # default config sections = {"connection":{"interface":'localhost:2240', "passw":None}, \ "mucous":{"autobuddy": "no"}, "tickers":{'default_ticker': "http://thegraveyard.org/daelstorm/mucous.html", \ 'tickers_enabled': 'yes', "rooms":{} }, "rooms": {"default_room":"museek"}} def create_config(): parser.read([config_file]) mucous_config = file(config_file, 'w') for i in sections.keys(): if not parser.has_section(i): parser.add_section(i) for j in sections[i].keys(): if j not in ["sharedfiles", "sharedfilesstreams","wordindex","fileindex","sharedmtimes"]: parser.set(i,j, sections[i][j]) else: parser.remove_option(i,j) parser.write(mucous_config) mucous_config.close() def read_config(): parser.read([config_file]) for i in parser.sections(): for j in parser.options(i): val = parser.get(i,j, raw = 1) if j in ['login','passw','interface', 'tickers_enabled', 'default_room', "autobuddy"] : sections[i][j] = val #print j else: try: sections[i][j] = eval(val, {}) except: sections[i][j] = None # if i not in sections.keys(): # print "Bogus config section:",i # elif j not in sections[i].keys() and j != "filter": # print "Bogus config option",j,"section",i # for j, z in parser.items(i): # print i, j, z # for j, z in sections.items(): # print j, z#[0], z[1] # print "Config Loaded" def update_config(): mucous_config = file(config_file, 'w') for i in sections.keys(): if not parser.has_section(i): parser.add_section(i) for j in sections[i].keys(): if j not in ["sharedfiles","sharedfilesstreams","wordindex","fileindex","sharedmtimes"]: parser.set(i,j, sections[i][j]) else: parser.remove_option(i,j) parser.write(mucous_config) mucous_config.close() def check_path(): if os.path.exists(config_dir): if os.path.exists(config_file) and os.stat(config_file)[6] > 0: read_config() else: create_config() else: os.mkdir(config_dir, 0700) create_config() check_path() class editor: def __init__(self, win, escaped, textwin, line = ""): self.win = win self.escaped = escaped self.h, self.w = win.getmaxyx() self.scroll = 0 self.textwin = textwin self.line = line self.x = len(self.line) self.fixpos() self.escape = False self.y = None # Debugging: output deleted classes # def __del__(self): # debug_log = file(config_dir+"errors", 'a') # print >> debug_log, "Deleting instance of", self.__class__.__name__ # debug_log.close() def process(self, c): pos = self.x + self.scroll # debugging: display keypress #print c if c == "KEY_MOUSE": if not self.escape: self.escaped(c, self.line) elif c == "KEY_LEFT" or c == chr(2): if self.escape: self.escaped(c, self.line) else: self.x -= 1 elif c == chr(93) or c == chr(91) or c == chr(34) or c == chr(35): if self.escape: self.escaped(c, self.line) else: self.line = self.line[:pos] + c + self.line[pos:] self.x += 1 elif c == "KEY_RIGHT" or c == chr(6): if self.escape: self.escaped(c, self.line) else: self.x += 1 elif c in ("KEY_F(1)", "KEY_F(2)", "KEY_F(3)", "KEY_F(4)", "KEY_F(5)", "KEY_F(6)", "KEY_F(7)", "KEY_F(8)", "KEY_F(9)", "KEY_F(10)"): if not self.escape: self.escaped(c, self.line) elif c in ("KEY_UP", "KEY_DOWN", "KEY_PPAGE", "KEY_NPAGE", "KEY_HOME", "KEY_END"): # Scrolling if not self.escape: self.escaped(c, self.line) elif c == "KEY_IC": # Insert self.escaped(c, self.line) elif c == "KEY_DC" or c == chr(4): self.line = self.line[:pos] + self.line[pos+1:] elif c == chr(5): self.x = len(self.line) elif c == chr(1): self.x = self.scroll = 0 elif c == chr(10) or c == "KEY_ENTER": self.escape = False return True elif c == chr(9): # tab self.escaped(c, self.line) return False elif c == chr(11): self.line = self.line[:pos] self.x = len(self.line) self.scroll = 0 elif c == chr(23): # Ctrl-W z = self.line.split(' ') if len(z) >1: if z[-1] != ' ' and z[-1] != '': self.line = '' for s in z: if s != z[-1]: self.line = self.line + s +" " elif s == z[-1]: self.line = self.line break else: self.line = '' for s in z: if s not in (z[-1], z[-2]): self.line = self.line + s +" " elif s == z[-2]: self.line = self.line break else: self.line = '' self.x = len(self.line) elif c == chr(127) or c == "KEY_BACKSPACE" or c == chr(8): if pos > 0: self.line = self.line[:pos-1] + self.line[pos:] self.x -= 1 elif c == chr(27): self.escape = True return False elif len(c) == 1 and ord(c[0]) >= 32 and ord(c[0]) <127: self.line = self.line[:pos] + c + self.line[pos:] self.x += 1 self.fixpos() self.escape = False return False def fixpos(self): self.x1 = self.x if self.x1 <= 0: self.x1 = 0 while self.scroll + self.x > len(self.line): self.x -= 1 while self.x >= self.w: self.scroll += 1 self.x -= 1 if self.x < 0: self.scroll += self.x self.x = 0 if self.scroll < 0: self.scroll = 0 self.win.erase() self.win.addstr(self.line[self.scroll:self.scroll+self.w-1]) self.win.refresh() def reset(self): self.x = self.scroll = 0 self.line = "" self.win.erase() self.win.refresh() class mucous(driver.Driver): # Debugging # def __del__(self): # debug_log = file(config_dir+"errors", 'a') # print >> debug_log, "Deleting instance of", self.__class__.__name__ # debug_log.close() def __init__(self): driver.Driver.__init__(self) self.rooms = {} self.joined = [] self.current = None # Non-Chat edit title self.username = None # Your username self.manual_user = None # Manual Download Username self.pm_user = None # Last Private Messaged user self.current_room = None # Current Chatroom # Temporary Logs self.log = [""] * 4 self.onlinestatuslog =[""] self.usernamelog = [""] self.uploadlog = [""] self.downloadlog =[""] self.searchwinlog = [""] self.alertwinlog = "" self.privatelog = ["Global Private Messaging commands:\n/pm \n/msg \nOr, type in the username you wish to PM below, and then type your messages."] self.searchlog = ["Global search commands:\n/searchfor \n/searchbuddy \n/download \nOr, type in the query, below."] self.browselog = ["Global browsing commands:\n/buser \n/bdown \n/bsearch \nOr, type in the user you wish to browse, below."] self.infolog = ["","","","Global User Information commands:\n/userinfo ","\n/stat ","\n/ip ","\nOr type the user name that you wish get recieve userinfo from, below.", "\n--"] self.buddylog = [""] self.banlog = [""] self.ignorelog = [""] self.uptransferlog = [""] self.downtransferlog = [""] self.display_which_text = "chat" # default mode self.ip_requested = None self.info_requested = None self.stat_requested = None self.browse_requested = None self.status = None self.startup = 1 self.size = None self.master_roomlist = {} self.roomlogs = {} self.scrollup = 0 self.scrollup_static = 0 self.requested_room_list = False self.all_roomlist = {} # searches self.search_visible = 1 self.s_tickets = [] self.s_query = {} self.search_results = {} self.search_number = 0 self.search_type = "globally" # transfers self.browse_results = {} self.browse_number = 0 self.upload_number = 0 self.upload_results = {} self.download_number = 0 self.download_results = {} self.transfers = {} self.transfers["downloads"] = {} self.transfers["uploads"] = {} self.transfer_display_mode = 'active' self.transferscroll="upload" self.down_transfer_numbers = {} self.up_transfer_numbers = {} # config self.config = {} self.invalidpass = 0 self.stats = [] # tickers self.ticker_room = None self.master_ticklist = {} self.unhide = "false" # show password? # Help lists self.commandlist = "/me", "/join", "/part", "/talk", "/list", "/un", "/down", "/abort", "/remove", "/help", "/info", "/autojoin", "/noauto", "/roomlist", "/roomlistrefresh", "/inrooms", "/pm", "/msg", "/np", "/tick", "/settick", "/listtick", "/ticker", "/interface", "/password", "/save", "/connect", "/disconnect", "/autobuddy", "/privbuddy", "/onlybuddy", "/slots","/buddy", "/unbuddy", "/ban", "/banlist", "/unban", "/nuke", "/unnuke", "/ignore", "/unignore", "/unhide", "/userinfo", "/ip", "/stat", "/away", "/abortup", "/abortdown", "/removeup", "/removedown", "/retry", "/clearup", "/cleardown", "/search", "/searchfor", "/searchbuddy", "/download", "/downdir" "/browse", "/browseuser", "/browsesearch", "/browsedown", "/downuser", "/downpath", "/downpathdir", "/chat", "/ignorelist", "/banlist", "/transfer", "/private", "/buddylist", "/setup", "/quit", "/share-mode" # not real commands "/un", "/down", "/abort", "/remove", self.help_chat = "\n----[Chat Commands]---- \ \n/join \t/part \ \n/talk \ \n/list \t\t(lists of users)\ \n/autojoin \t(autojoin room next session)\ \n/noauto \t\t(don't autojoin next session)\ \n/roomlist \t(list of rooms >= number)\ \n/roomlistrefresh\t(redownload roomlist from server)\ \n/inrooms\t(list of joined rooms)\ \n/pm \t\t(private message)\ \n/msg \t\t(send message to last user)\ \n/np\t\t\t(XMMS/BMP Now playing script)" self.help_ticker = "\n----[Ticker Commands]---- \ \n/tick \t\t(Choose room to set ticker)\ \n/settick \t(set ticker for last room)\ \n/listtick \t(Lists tickers in room)\ \n/ticker \t\t(Toggle tickers)" self.help_connect = "\nConnection Configuration\ \n/interface or \ \n/password \ \n/connect\t(Attempts to connect to Museekd)\ \n/disconnect\t(disconnects from Museekd)\ \n/save\t\t(Writes settings to config)" self.help_setup = "\nSetup\ \n/autobuddy (Auto-buddy users you download from)\ \n/privbuddy (Toggle Privileging buddies)\ \n/onlybuddy (Toggle Only sharing to buddies)\ \n/slots (Set upload slots)\ \n/unhide (Toggle show password)" self.help_user = "\n----[User Commands]---- \ \n/buddy\t\t/unbuddy\ \n/ban\t\t/unban \ \n/nuke\t\t/unnuke \ \n/ignore\t\t/unignore\ \n/userinfo\t\t/ip \ \n/stat\t\ \n/away (Toggle your Online/Away Status)" self.help_transfer = "\n----[Transfer Commands]---- \ \n/abortu \t/abortup \t\t(Abort Upload)\ \n/abortd \t/abortdown \t(Abort Download)\ \n/removeu \t/removeup \t\t(Remove Upload)\ \n/removed \t/removedown \t(Remove Download)\ \n/retry \t\t\t\t(Retry Download)\ \n/clearup \t\t\t\t(Clear failed/finished Uploads)\ \n/cleardown \t\t\t\t(Clear finished Download)\ " self.help_mode = "\n----[Mode Commands]---- \ \n/chat\t\t[Chat Mode]\ \n/transfer\t[Transfer Mode]\ \n/info\t\t[Info Mode]\ \n/browse\t\t[Browse Mode]\ \n/private\t[Private Message Mode]\ \n/search\t\t[Search Mode]\ \n/buddylist\t[Buddy Mode]\ \n/banlist\t[Ban Mode]\ \n/ignorelist\t[Ignore Mode]\ \n/setup\t[Setup Mode]\ " self.help_help = "\n----[Help Commands]---- \ \n/help\t\t(This Message)\ \n/help connect\t(Connection Commands)\ \n/help setup\t(Connection Commands)\ \n/help mode\t(Mode Commands)\ \n/help chat\t(Chatroom Commands)\ \n/help ticker\t(Ticker Commands)\ \n/help user\t(User Commands)\ \n/help transfer\t(Transfer Commands)\ \n/help search\t(Search Commands)\ \n/help download\t(Download Commands)\ \n/help keys\t(Special Keys)\ \n/quit" self.help_search = "\n----[Search/Browse Commands]----\ \n/search\t[Switch to Search Mode]\ \n/searchfor \ \n/searchbuddy \ \n/download \ \n/downdir \ \n/browse\t[Switch to Browse Mode]\ \n/browseuser /buser \ \n/browsedown /bdown \ \n/browsesearch /bsearch " self.help_download = "\n----[Manual Download Commands]----\ \n/downuser (sets download user)\ \n/downpath (download file from user)\ \n/downpathdir (download dir from user)\ " self.help_keys ="\n------[Keys]------ \ \nESC or Alt + [, ], <-, ->\t(Change Room / Transfer display mode)\ \nInsert\t\t\t\t(Same as above)\ \nTab\t\t(Completes nicks)\ \nHome/End\t(switches Upload & Download scrolling)\ \nUp, PageUp\t(Scroll Up a line, a page)\ \nDown, PageDown\t(Scroll Down a line, a page)\ \nF1->Chat\t\tF6->Browse\ \nF2->Private Messages\tF7->Buddy List\ \nF3->Transfers\t\tF8->Ban List\ \nF4->Search\t\tF9->Ignore List\ \nF5->Info\t\tF10->Setup" def build(self, stdscr, line = ""): self.stdscr = stdscr self.stdscr.clear() self.stdscr.refresh() self.h, self.w = self.stdscr.getmaxyx() if self.h >=15 and self.w >=77: self.inputwin = curses.newwin(3,self.w,self.h-4,0) self.inputwin.border() self.inputwin.refresh() self.editwin = curses.newwin(1, self.w-2, self.h-3, 1) #self.hotkeys() if self.display_which_text == "chat": #if self.current_room != None: # self.set_room(self.current_room) self.chat_mode() elif self.display_which_text == "private": self.private_mode() elif self.display_which_text == "browse": self.browse_mode() elif self.display_which_text == "transfer": self.transfer_mode() elif self.display_which_text == "info": self.info_mode() elif self.display_which_text == "search": self.search_mode() elif self.display_which_text == "buddies": self.buddy_mode() elif self.display_which_text == "banned": self.ban_mode() elif self.display_which_text == "ignored": self.ignore_mode() elif self.display_which_text == "setup": self.setup_mode() self.onlinestatus = curses.newwin(1, 8, 0, 0) self.onlinestatus.scrollok(1) self.onlinestatus.idlok(1) for i in range(1): self.onlinestatus.addstr(self.onlinestatuslog[-(1)]) self.onlinestatus.refresh() self.uploadwin = curses.newwin(1, 10, 0, 25) self.uploadwin.scrollok(1) self.uploadwin.idlok(1) for i in range(1): self.uploadwin.addstr(self.uploadlog[-(1)], curses.A_UNDERLINE) self.uploadwin.refresh() self.downloadwin = curses.newwin(1, 10, 0, 35) self.downloadwin.scrollok(1) self.downloadwin.idlok(1) for i in range(1): self.downloadwin.addstr(self.downloadlog[-(1)], curses.A_UNDERLINE) self.downloadwin.refresh() self.searchwin = curses.newwin(1, 15, 0, self.w-30) self.searchwin.scrollok(1) self.searchwin.idlok(1) for i in range(1): self.searchwin.addstr(self.searchwinlog[-(1)], curses.A_UNDERLINE) self.searchwin.refresh() self.alertwin = curses.newwin(1, 15, 0, self.w-15) self.alertwin.scrollok(1) self.alertwin.idlok(1) self.alertwin.addstr(self.alertwinlog, curses.color_pair(1) | curses.A_UNDERLINE) self.alertwin.refresh() self.usernamewin = curses.newwin(1, 16, 0, 9) self.usernamewin.scrollok(1) self.usernamewin.idlok(1) for i in range(1): self.usernamewin.addstr(self.usernamelog[-(1)]) self.usernamewin.refresh() self.edit = editor(self.editwin, self.escaped, self.textwin, line) self.stdscr.nodelay(1) else: sys.exit("\nMucous requires at least 77 columns and 15 rows") def cb_disconnected(self): self.info_log("disconnected from museekd") self.onlinestatuslog.append("\nClosed") self.onlinestatuslog = self.onlinestatuslog[-5:] self.onlinestatus.addstr(self.onlinestatuslog[-1], curses.color_pair(1)) self.onlinestatus.refresh() for room in self.joined: msg = ("--- Disconnected from museekd ---") self.say("N", room, msg) def nickcheck(self): if self.username == None: self.info_mode() self.info_log("Connection is taking a while to start, maybe you are trying to connect to an FTP daemon?") driver.Driver.close(self) def disconnect(self): driver.Driver.close(self) def connect(self): keys = [] while 1: self.host = sections["connection"]["interface"] self.password = sections["connection"]["passw"] try: if self.invalidpass == 0: if self.password != None: self.timer = threading.Timer(5.0, self.nickcheck) self.timer.start() driver.Driver.connect(self, self.host, self.password, messages.EM_CHAT | messages.EM_USERINFO| messages.EM_PRIVATE| messages.EM_TRANSFERS | messages.EM_USERSHARES | messages.EM_CONFIG) break else: raise Exception, "IdASS" else: raise Exception, "INVPASS" except Exception, e: self.info_mode() self.info_log(str(e)) self.timer.cancel() if e == "INVPASS": print "Incorrect Password, try another." elif e == [111, "Connection refused"]: self.info_log(e[1] +", make sure the daemon is running, or change the interface.") self.info_log("Connection failed, try changing your interface or password") self.info_log(self.help_connect) q = "42" while q == "42": sleep(0.01) try: c = self.stdscr.getkey(self.h-3, self.edit.x+1) keys.append(c) except: pass if not keys: d = 1000 else: d = 0 while keys: c, keys = keys[0], keys[1:] if self.edit.process(c): line = self.edit.line if line == "/quit" or line == "/exit": return if line[:11] == "/interface " and line[11:] != "": self.info_mode() sections["connection"]["interface"] = line[11:] self.info_log("Museekd interface set to: " + line[11:]) elif line[:10] == "/password " and line[10:] != "": self.info_mode() sections["connection"]["passw"] = line[10:] self.info_log("New password set") elif line[:8] == "/connect": self.chat_mode() self.invalidpass = 0 q = "43" elif line[:8] == "/version": self.info_mode() self.info_log("\nMucous version: %s" % version) elif line[:5] == "/help": self.info_mode() self.info_log(self.help_connect) elif line[:5] == "/save": update_config() self.info_mode() self.info_log("Config Saved") elif line[:5] == "/list": self.info_log(sections["connection"]["interface"]) self.info_log(sections["connection"]["passw"]) self.edit.reset() def process(self): # c = None keys = [] while 1: try: c = self.stdscr.getkey(self.h-3, self.edit.x+1) keys.append(c) except: pass if not keys: d = 1000 else: d = 0 if self.socket != None: r, w, x = select.select([self.socket, sys.stdin], [], [self.socket], d) else: sleep(0.01) if self.socket in r: driver.Driver.process(self) if sys.stdin in r: try: c = self.stdscr.getkey(self.h-2, self.edit.x) keys.append(c) except Exception, e: pass while keys: c, keys = keys[0], keys[1:] if self.edit.process(c): line = self.edit.line if line[:1] == "/" and line[:4] != "/me ": if line == "/quit" or line == "/exit": return elif line[:11] == "/disconnect": self.disconnect() elif line[:5] == "/help": self.info_mode() if line[5:] == " chat": self.info_log(self.help_chat) elif line[5:] == " mode": self.info_log(self.help_mode) elif line[5:] == " user": self.info_log(self.help_user) elif line[5:] == " search": self.info_log(self.help_search) elif line[5:] == " browse": self.info_log(self.help_search) elif line[5:] == " transfer": self.info_log(self.help_transfer) elif line[5:] == " ticker": self.info_log(self.help_ticker) elif line[5:] == " download": self.info_log(self.help_download) elif line[5:] == "": self.info_log(self.help_help) elif line[5:] == " keys": self.info_log(self.help_keys) elif line[5:] == " connect": self.info_log(self.help_connect) elif line[5:] == " setup": self.info_log(self.help_setup) self.edit.reset() ''' Chatrooms ''' elif line[:6] == "/talk ": self.set_room(line[6:]) elif line[:6] == "/join ": self.send(messages.JoinRoom(line[6:])) elif line == "/part" and self.current_room: self.send(messages.LeaveRoom(self.current_room)) elif line[:6] == "/part ": self.send(messages.LeaveRoom(line[6:])) elif line[:10] == "/autojoin ": if line[10:] in rooms.joined: self.send(messages.ConfigSet("autojoin", line[10:], "")) self.info_log("Added %s to AutoJoin list" % line[5:]) elif line[:8] == "/noauto ": if line[8:] in rooms.joined: self.send(messages.ConfigRemove("autojoin", line[8:])) self.info_log("Removed %s from AutoJoin list" % line[7:]) elif line[:4] == "/pm ": if line[4:] != '': self.pm_user= line[4:] self.private_mode() self.set_edit_title("Send message to: " + self.pm_user) elif line[:5] == "/msg " and line[5:] != '': if self.pm_user != None: message = line[5:] self.send(messages.PrvateMessage(self.pm_user, message)) self.private_log("PM to: [%s] %s" % (self.pm_user, message)) if self.alertwinlog == "\nNew PM": self.alert_status("\n ") else: self.private_log("Set a user to message with /pm!") elif line[:5] == "/away": if self.status == 0: self.send(messages.SetStatus(1)) elif self.status == 1: self.send(messages.SetStatus(0)) elif line[:3] == "/np": p = "/tmp/xmms-info" if os.path.exists(p): fsock = open(p) for i in range(3): s = fsock.readline()[8:-1] for i in range(10): m = fsock.readline()[7:-1] message ="Now %s: %s " % (s, m) fsock.close() self.send(messages.SayRoom(self.current_room, message)) else: self.info_log("WARNING: XMMS or BMP isn't running or the InfoPipe plugin isn't enabled") ''' User Information ''' elif line[:10] == "/userinfo " and line[10:] != '': self.info_requested = line[10:] self.send(messages.UserInfo(self.info_requested)) elif line[:4] == "/ip " and line[4:] != '': self.ip_requested = str(line[4:]) self.send(messages.PeerAddress(self.ip_requested)) elif line[:6] == "/stat " and line[6:] != '': self.stat_requested = str(line[6:]) self.send(messages.PeerStats(self.stat_requested)) ''' MODE SELECTIONS ''' elif line[:5] == "/chat" and line[5:] == '': self.chat_mode() elif line[:8] == "/private" and line[8:] == '': self.private_mode() elif line[:7] == "/search" and line[7:] == '': self.search_mode() elif line[:9] == "/transfer" and line[9:] == '': self.transfer_mode() elif line[:5] == "/info" and line[5:] == '': self.info_mode() elif line[:10] == "/buddylist" and line[10:] == '': self.buddy_mode() elif line[:8] == "/banlist" and line[8:] == '': self.ban_mode() elif line[:11] == "/ignorelist" and line[11:] == '': self.ignore_mode() elif line[:6] == "/setup" and line[6:] == '': self.setup_mode() ''' CONFIG ''' elif line[:5] == "/save" and line[5:] == '': update_config() self.info_mode() self.info_log("Config Saved") elif line[:11] == "/interface " and line[11:] != "": sections["connection"]["interface"] = line[11:] self.info_log("Museekd interface set to: " + line[11:]) elif line[:10] == "/password " and line[10:] != "": sections["connection"]["passw"] = line[10:] self.info_log("New password set") elif line[:8] == "/version": self.info_mode() self.info_log("\nMucous version: %s" % version) elif line[:8] == "/connect": self.connect() ''' Tickers ''' elif line[:5] == "/tick": if line[5:] == '': self.ticker_room = self.current_room self.info_log("You picked room: " +self.ticker_room+" to set a ticker.") self.info_mode() elif line[5:6] == " " and line[6:] != '': self.ticker_room = line[6:] self.info_log("You picked room: " +self.ticker_room+" to set a ticker.") self.info_mode() elif line[:7] == "/ticker" and line[7:] == '': if sections["tickers"]["tickers_enabled"] == 'no': sections["tickers"]["tickers_enabled"] = 'yes' self.info_log("Tickers Enabled") elif sections["tickers"]["tickers_enabled"] == 'yes': sections["tickers"]["tickers_enabled"] = 'no' self.info_log("Tickers Disabled") elif line[:9] == "/tickroom" and line[9:] == '': self.ticker_room = self.current_room self.set_room("% Set ticker for: "+ self.current_room+(" %")) elif line[:9] == "/settick " and line[9:] != '': if self.ticker_room != None: message = line[9:] self.send(messages.RoomTickerSet(self.ticker_room, message)) sections["tickers"]["rooms"][self.ticker_room]=message self.info_log("You set your ticker in " +self.ticker_room+" to "+message) else: self.info_log("Choose a room with /tick, first.") ''' List tickers in current room or selected rooms ''' elif line[:9] == "/listtick": if line [9:] == '': woom = self.current_room else: woom = line[10:] alpha_list = SortedDict() for rooms in self.master_ticklist: alpha_list[rooms] = self.master_ticklist[rooms] if sections["tickers"]["tickers_enabled"] == 'yes': for rooms, ticks in alpha_list.items(): if rooms == woom: self.info_log("Tickers in room: "+str(rooms)) ttickers =[] ttickers = ticks.keys() ttickers.sort() for names in ttickers: self.info_log(" ["+str(names)+'] '+str(ticks[names])) self.textwin.refresh() ''' User Management ''' elif line[:5] == "/ban " and line[5:] != '': username = line[5:] if username not in self.config["banned"].keys(): self.send(messages.ConfigSet("banned", username, "banned by mucous")) elif line[:7] == "/unban " and line[7:] != '': username = line[7:] if username in self.config["banned"].keys(): self.send(messages.ConfigRemove("banned", username)) else: self.info_log("User not in ban list: %s" % username) elif line[:8] == "/ignore " and line[8:] != '': username = line[8:] if username not in self.config["ignored"].keys(): self.send(messages.ConfigSet("ignored", username, "")) self.info_log("Ignored: %s" % username) elif line[:10] == "/unignore " and line[10:] != '': username = str(line[10:]) if username in self.config["ignored"].keys(): self.send(messages.ConfigRemove("ignored", username)) else: self.info_log("User not in ignore list: %s" % username) elif line[:7] == "/buddy " and line[7:] != '': username = str(line[7:]) if username not in self.config["buddies"].keys(): self.send(messages.ConfigSet("buddies", username, "buddied by mucous")) elif line[:9] == "/unbuddy " and line[9:] != '': username = str(line[9:]) if username in self.config["buddies"].keys(): self.send(messages.ConfigRemove("buddies", username)) else: self.info_log("User not in buddy list: %s" % username) elif line[:11] == "/share-mode": if self.config["transfers"]["only_buddies"] == "true": self.send(messages.ConfigSet("transfers", "only_buddies", "false")) elif self.config["transfers"]["only_buddies"] == "false": self.send(messages.ConfigSet("transfers", "only_buddies", "true")) elif line[:11] == "/autobuddy": if sections["mucous"]["autobuddy"] == "yes": sections["mucous"]["autobuddy"] = "no" self.info_log("AutoBuddy Disabled") elif sections["mucous"]["autobuddy"] == "no": sections["mucous"]["autobuddy"] = "yes" self.info_log("AutoBuddy Enabled") elif line[:6] == "/nuke " and line[6:] != '': username = str(line[6:]) if username not in self.config["banned"].keys(): self.send(messages.ConfigSet("banned", username, "banned by mucous")) if username not in self.config["ignored"].keys(): self.send(messages.ConfigSet("ignored", username, "")) self.info_log("Nuked: %s" % username) elif line[:8] == "/unnuke " and line[8:] != '': username = str(line[8:]) if username in self.config["ignored"].keys(): self.send(messages.ConfigRemove("ignored", username)) if username in self.config["banned"].keys(): self.send(messages.ConfigRemove("banned", username)) self.info_log("Irradiated: %s" % username) ''' List Users in room ''' elif line[:5] == "/list": self.startup = 0 if line [5:6] == ' ': woom = line[6:] else: woom = self.current_room fiddlednames = [] if self.rooms[woom] != None: for names in self.rooms[woom]: fiddlednames.append(str(names) +',') fiddlednames.sort() self.info_log("Users in "+ woom +": "+ (string.join(map(str, fiddlednames))[:-1])) self.textwin.refresh() ''' List Rooms whose number of users is greater than the number you input ''' elif line[:9] == "/roomlist": if line[9:] == '': self.display_room_list() elif line[9:10] == ' ': try: self.size = int(line[10:]) self.display_room_list() except: self.info_log("Input an integer with /roomlist") elif line[9:] == 'refresh': self.requested_room_list = True self.send(messages.RoomList()) elif line[:8] == "/inrooms" and line[8:] == '': w = '' for room in self.joined: w += room + ', ' self.info_log("You are in: %s" %w[:-2]) ''' Manual Download ''' elif line[:10] == "/downuser " and line[10:] != '': self.transfer_mode() self.manual_user = line[10:] self.set_edit_title("% % User: "+line[10:] + " (input download path) % %") elif line[:10] == "/downpath " and line[10:] != '': path = line[10:] if self.manual_user != None and self.manual_user != '': user = self.manual_user self.send(messages.DownloadFile(user, path)) self.info_log("Trying to Download: " + path+" from "+ user) elif line[:13] == "/downpathdir " and line[13:] != '': directory = line[13:] if self.manual_user != None and self.manual_user != '': user = self.manual_user self.send(messages.GetFolderContents(user, directory)) self.info_log("Try to Download directory: %s from %s" % (directory, user)) ''' Search Globally for files & Download them ''' elif line[:11] == "/searchfor " and line[11:] != '': query = line[11:] self.send(messages.Search(query)) self.search_log("Started search for: "+ query) elif line[:13] == "/searchbuddy " and line[13:] != '': query = line[13:] self.send(messages.BuddySearch(query)) self.search_log("Started Buddy search for: "+ query) elif line[:10] == "/download " or line[:9] == "/downdir ": sinput = None dinput = None linput = None if line[:10] == "/download " and line[10:] != '': linput = sinput = line[10:] elif line[:9] == "/downdir " and line[9:] != '': linput = dinput = line[9:] if linput != None: try: searchnum = int(linput) if self.search_results != {}: if self.search_results[searchnum] != None: user = self.search_results[searchnum][1] path = self.search_results[searchnum][5] if sinput != None: self.send(messages.DownloadFile(user, path)) self.info_log("Try to Download file: %s from %s" % (path, user)) elif dinput != None: r = path.split('\\') directory = '' for s in r: if s != r[-1]: directory += s+'\\' self.send(messages.GetFolderContents(user, directory)) self.info_log("Try to Download directory: %s from %s" % (directory, user)) if sections["mucous"]["autobuddy"] == "yes": if user not in self.config["buddies"].keys(): self.send(messages.ConfigSet("buddies", user, "buddied by mucous")) self.info_log("Auto-Buddied: %s" % user) else: self.info_log("No such file") else: self.info_log("You need to search, first ;)") except: self.info_log("Enter an Integer") ''' Browse Shares & Download from them ''' elif line[:12] == "/browseuser " or line[:7] == "/buser ": user = None if line[:12] == "/browseuser " and line[12:] != '': user = line[12:] elif line[:7] == "/buser " and line[7:] != '': user = line[7:] if user != None: self.browse_requested = user self.send(messages.UserShares(user)) self.browse_log("\nStarted browsing: %s" % user) elif line[:14] == "/browsesearch " or line[:9] == "/bsearch ": l_input = None if line[:14] == "/browsesearch " and line[14:] != '': l_input = line[14:] elif line[:9] == "/bsearch " and line[9:] != '': l_input = line[9:] if l_input != None: search = re.compile('.*' +str(l_input) + '.*', re.DOTALL | re.I) self.browse_log("search compiled") for item, path in self.browse_results.items(): if re.match( search, path[1]): self.browse_log("Found: [" + str(item) +'] ' +path[1]) elif line[:12] == "/browsedown " or line[:7] == "/bdown ": l_input = None if line[:12] == "/browsedown " and line[12:] != '': l_input = line[12:] elif line[:7] == "/bdown " and line[7:] != '': l_input = line[7:] if l_input != None: try: browsenum = int(l_input) if self.browse_results != {}: if self.browse_results[browsenum] != None: username = self.browse_results[browsenum][0] path = self.browse_results[browsenum][1] self.send(messages.DownloadFile(user, path)) self.info_log("Try to Download: %s from %s" % (path, username)) if sections["mucous"]["autobuddy"] == "yes": if username not in self.config["buddies"].keys(): self.send(messages.ConfigSet("buddies", username, "buddied by mucous")) self.info_log("Auto-Buddied: %s" % username) else: self.info_log("No such file") else: self.info_log("You need to browse, first ;)") except: self.info_log("Enter an Integer") elif line[:11] == "/hidesearch": self.search_visible = 0 self.info_log("Searches hidden") elif line[:11] == "/showsearch": self.search_visible = 1 self.info_log("Searches made visible") ''' Manage Transfers ''' elif line[:8] == "/abortd " or line[:11] == "/abortdown ": transfer = None if line[:8] == "/abortd " and line[8:] != '': try: transfer = int(line[8:]) except: self.info_log("Enter an Integer") elif line[:11] == "/abortdown " and line[11:] != '': try: transfer = int(line[11:]) except: self.info_log("Enter an Integer") if transfer != None: if transfer in self.down_transfer_numbers.keys(): for username, path in self.down_transfer_numbers[transfer].items(): #self.info_log(username +' '+ path) self.info_log("Aborting download: [%s] %s" % (username, path)) self.send(messages.TransferAbort(0, username, path)) else: self.info_log("No such transfer #" + str(transfer)) elif line[:8] == "/abortu " or line[:9] == "/abortup ": transfer = None if line[:8] == "/abortu " and line[8:] != '': try: transfer = int(line[8:]) except: self.info_log("Enter an Integer") elif line[:9] == "/abortup " and line[9:] != '': try: transfer = int(line[9:]) except: self.info_log("Enter an Integer") if transfer != None: if transfer in self.up_transfer_numbers.keys(): for username, path in self.up_transfer_numbers[transfer].items(): self.info_log("Aborting upload: [%s] %s" % (username, path)) self.send(messages.TransferAbort(1, username, path)) else: self.info_log("No such transfer #" + str(transfer)) elif line[:9] == "/removeu " or line[:10] == "/removeup ": transfer = None if line[:9] == "/removeu " and line[9:] != '': try: transfer = int(line[9:]) except: self.info_log("Enter an Integer") elif line[:10] == "/removeup " and line[10:] != '': try: transfer = int(line[10:]) except: self.info_log("Enter an Integer") if transfer != None: if transfer in self.up_transfer_numbers.keys(): for username, path in self.up_transfer_numbers[transfer].items(): self.info_log("Removing upload: [%s] %s" % (username, path)) self.send(messages.TransferRemove(1, username, path)) else: self.info_log("No such transfer #" + str(transfer)) elif line[:9] == "/removed " or line[:12] == "/removedown ": transfer = None if line[:9] == "/removed " and line[9:] != '': try: transfer = int(line[9:]) except: self.info_log("Enter an Integer") elif line[:12] == "/removedown " and line[12:] != '': try: transfer = int(line[12:]) except: self.info_log("Enter an Integer") if transfer != None: if transfer in self.down_transfer_numbers.keys(): for username, path in self.down_transfer_numbers[transfer].items(): self.info_log("Removing download: [%s] %s" % (username, path)) self.send(messages.TransferRemove(0, username, path)) else: self.info_log("No such transfer #" + str(transfer)) elif line[:7] == "/retry " and line[7:] != '': transfer = None try: transfer = int(line[7:]) except: self.info_log("Enter an Integer") if transfer != None: if transfer in self.down_transfer_numbers.keys(): for username, path in self.down_transfer_numbers[transfer].items(): self.info_log("Retrying download: [%s] %s" % (username, path)) self.send(messages.DownloadFile(username, path)) else: self.info_log("No such transfer #" + str(transfer)) elif line[:7] == "/slots " and line[7:] != "": slots = None try: slots = int(line[7:]) except: self.info_log("Enter an Integer") if slots != None: self.send(messages.ConfigSet("transfers", "upload_slots", str(slots))) elif line[:10] == "/privbuddy": if self.config["transfers"]["privilege_buddies"] == "true": self.send(messages.ConfigSet("transfers", "privilege_buddies", "false")) elif self.config["transfers"]["privilege_buddies"] == "false": self.send(messages.ConfigSet("transfers", "privilege_buddies", "true")) elif line[:10] == "/onlybuddy": if self.config["transfers"]["only_buddies"] == "true": self.send(messages.ConfigSet("transfers", "only_buddies", "false")) elif self.config["transfers"]["only_buddies"] == "false": self.send(messages.ConfigSet("transfers", "only_buddies", "true")) elif line[:7] == "/unhide": if self.unhide == "true": self.unhide = "false" elif self.unhide == "false": self.unhide = "true" if self.display_which_text == "setup": self.setup_mode() elif line[:10] == "/buddyall": self.info_log("Buddying ALL users currently transferring to or from you.") currentusersintransferlist = {} for userpath, values in self.transfers["uploads"].items(): #for stuff in values.values(): currentusersintransferlist[values[1]] = 0 for userpath, values in self.transfers["downloads"].items(): #for stuff in values.values(): currentusersintransferlist[values[1]] = 0 for username in currentusersintransferlist.keys(): if username not in self.config["buddies"].keys(): self.send(messages.ConfigSet("buddies", username, "Buddied by mucous")) elif line[:8] == "/clearup": for userpath, values in self.transfers["uploads"].items(): if values[3] in (0, 10, 11, 12, 13, 14): self.send(messages.TransferRemove(1, values[1], values[2])) elif line[:10] == "/cleardown": for userpath, values in self.transfers["downloads"].items(): if values[3] == 0: self.send(messages.TransferRemove(0, values[1], values[2])) else: continue self.edit.reset() elif self.current and line: ''' Special Input Box for Downloading Manually ''' if self.current[:10] == '% % User: ' and line != '': if self.manual_user != None and self.manual_user != '': path = line self.send(messages.DownloadFile(self.manual_user, path)) self.info_log("Trying to Download: " + path+" from "+ self.manual_user) elif self.current[:12] == '% Set ticker' and line != '': self.send(messages.RoomTickerSet(self.ticker_room, line)) ''' Normal Chat Message ''' else: if line != '': if self.display_which_text == "chat": if self.current_room: self.send(messages.SayRoom(self.current_room, line)) elif self.display_which_text == "private": if self.pm_user != None: self.send(messages.PrivateMessage(self.pm_user, line)) self.private_log("PM to: [%s] %s" % (self.pm_user, line)) else: self.pm_user = line self.set_edit_title("Send message to: " + self.pm_user) #self.private_log("Set a user to message with /pm!") elif self.display_which_text == "search": if self.search_type == "globally": self.send(messages.Search(line)) elif self.search_type == "buddies": self.send(messages.BuddySearch(line)) elif self.display_which_text == "browse": self.send(messages.UserShares(line)) elif self.display_which_text == "info": self.info_log("Getting information about user: " +line) self.send(messages.UserInfo(line)) self.send(messages.PeerStats(line)) elif self.display_which_text == "buddies": if line not in self.config["buddies"].keys(): self.send(messages.ConfigSet("buddies", line, "buddied by mucous")) elif self.display_which_text == "banned": if line not in self.config["banned"].keys(): self.send(messages.ConfigSet("banned", line, "banned by mucous")) elif self.display_which_text == "ignored": if line not in self.config["ignored"].keys(): self.send(messages.ConfigSet("ignored", line, "ignored by mucous")) self.edit.reset() # -- v Museek Messages v def cb_login_error(self, reason): if reason == "INVPASS": self.invalidpass = 1 self.info_log("couldn't log in: Invalid Password") self.connect() else: self.invalidpass = 0 self.info_log("couldn't log in: " + reason) def cb_login_ok(self): self.invalidpass = 0 self.info_log("Logging in...") def cb_server_state(self, state, username): self.username = username self.usernamelog.append("\n"+username[:15]) self.usernamelog = self.usernamelog[-5:] self.usernamewin.addstr(self.usernamelog[-1]) self.usernamewin.refresh() self.upload_status("0") self.download_status("0") self.search_status("\nResults: 0") if state: self.info_log("connected to soulseek, username: " + username) self.onlinestatuslog.append("\nOnline") if sections["tickers"]["tickers_enabled"] == 'yes': self.info_log("Tickers enabled") else: self.info_log("Tickers disabled") else: self.info_log("not connected to soulseek") self.onlinestatuslog.append("\nOffline") self.onlinestatuslog = self.onlinestatuslog[-5:] self.onlinestatus.addstr(self.onlinestatuslog[-1]) self.onlinestatus.refresh() if self.joined: for room in self.joined: msg = ("--- Disconnected from Server ---") self.say("N", room, msg) def cb_room_state(self, roomlist, joined, tickers): for room, number in roomlist.items(): self.all_roomlist[room] = number for room in joined: if room not in self.roomlogs: self.roomlogs[room] = [] self.rooms[room] = joined[room] self.roomlist = [] self.at_join = [] alpha_list = SortedDict() for users in joined[room]: self.at_join.append(users+',') self.roomlist.append(users) self.master_roomlist[room] = self.roomlist if len(joined[room]) > 1: msg = ("Joined room: %s (%i users)" % (room, len(joined[room])) ) elif len(joined[room]) == 1: msg = ("Joined room: %s (%i user)" % (room, len(joined[room])) ) elif len(joined[room]) == 0: msg = ("Joined %s (No users)" % room) self.say("N", room, msg) # tickers == (rooms, [(user1: message1), (user2: message2),] ) # a string and then a dictionary for rooms, ticks in tickers.items(): if rooms == room: self.master_ticklist[room] = ticks for rooms, ticks in alpha_list.items(): if rooms == room: self.master_ticklist[room] = alpha_list[room] #SMALL ROOM USER PRINTOUT if len(joined[room]) <= 30: self.at_join.sort() x = string.join(map(str, self.at_join))[:-1] if len(joined[room]) > 0: self.roomlogs[room].append("NUsers in room: "+ x) if sections["tickers"]["tickers_enabled"] == 'yes': for rooms, ticks in self.master_ticklist.items(): if rooms == room: self.info_log("Tickers in room: "+str(rooms)) ttickers =[] ttickers = ticks.keys() ttickers.sort() for names in ttickers: self.info_log(" ["+str(names)+'] '+str(ticks[names])) self.info_log("") self.textwin.refresh() self.joined = self.rooms.keys() if self.joined: if sections["rooms"]["default_room"] != None: if sections["rooms"]["default_room"] in self.joined: self.current_room = sections["rooms"]["default_room"] self.set_room(sections["rooms"]["default_room"]) else: self.send(messages.JoinRoom(sections["rooms"]["default_room"])) self.set_room(self.joined[0]) else: self.current_room = self.joined[0] self.set_room(self.joined[0]) for rooms, tickers in sections["tickers"]["rooms"].items(): if rooms in self.joined: if self.username not in self.master_ticklist[rooms].keys(): self.send(messages.RoomTickerSet(rooms, tickers)) elif self.master_ticklist[rooms][self.username] != tickers: self.send(messages.RoomTickerSet(rooms, tickers)) def cb_room_list(self, roomlist): for name in roomlist: alpha_list[name] = roomlist[name] collapsed_roomlist = {} self.all_roomlist = {} if self.size == None: if len(roomlist) > 100: self.size = 50 else: self.size = 1 for x, y in alpha_list.items(): if y >= self.size: collapsed_roomlist[x] = y self.all_roomlist[x] = y if self.requested_room_list == True: roomstring = [] for x, y in collapsed_roomlist.items(): roomstring.append(x + ' ['+str(y)+'],') self.info_log("Rooms: " +(string.join(map(str, roomstring))[:-1])) self.info_log("Rooms with at least %s user(s): %s" % (self.size, len(collapsed_roomlist.keys() ) )) self.info_log("Total Number of rooms: %s" % len(roomlist)) self.requested_room_list = False def display_room_list(self): if self.size == None: if len(self.all_roomlist) > 100: self.size = 50 else: self.size = 1 collapsed_roomlist = {} for x, y in self.all_roomlist.items(): if y >= self.size: collapsed_roomlist[x] = y roomstring = [] for x, y in collapsed_roomlist.items(): roomstring.append(x + ' ['+str(y)+'],') self.info_log("Rooms: " +(string.join(map(str, roomstring))[:-1])) self.info_log("Rooms with at least %s user(s): %s" % (self.size, len(collapsed_roomlist.keys() ) )) self.info_log("Total Number of rooms: %s" % len(self.all_roomlist.keys())) self.requested_room_refresh = False def cb_room_said(self, room, user, text): if text[:4] == "/me ": msg = "* %s %s" % (user, text[4:]) self.say("M", room, msg) else: msg = "[%s] %s" % (user, text) if self.username in text: self.say("R", room, msg) if self.display_which_text != "chat": self.alert_status("Nick Mention") else: self.say("N", room, msg) if self.display_which_text != "chat": self.alert_status("New Chat") elif self.display_which_text == "chat" and self.current_room != room: self.alert_status(room[:14]) def cb_room_joined(self, room, users): if room not in self.roomlogs: self.roomlogs[room] = [] self.rooms[room] = users self.joined.append(room) if len(users) > 1: msg = ("Joined room: %s (%i users)" % (room, len(users)) ) elif len(users) == 1: msg = ("Joined room: %s (%i user)" % (room, len(users)) ) elif len(users) == 0: msg = ("Joined %s (No users)" % room) self.say("N", room, msg) # send list of users for rooms smaller than 30 users if len(self.rooms[room]) <= 50: self.at_join = [] for user in users.keys(): self.at_join.append(str(user)+',') self.at_join.sort() x = string.join(map(str, self.at_join))[:-1] if len(users) > 0: self.roomlogs[room].append("NUsers in room: "+ x) if self.display_which_text == "chat": self.set_room(room) # Send Default ticker to all new rooms if sections["tickers"]["default_ticker"] != None: self.send(messages.RoomTickerSet(room, sections["tickers"]["default_ticker"])) def cb_room_left(self, room): self.say("N", None, "Left room %s" % room) del self.rooms[room] if room == self.current_room: ix = self.joined.index(room) if ix > 0: ix -= 1 self.set_room(self.joined[ix]) self.joined.remove(room) if not self.joined: self.set_room(None) def cb_room_user_joined(self, room, user, data): if self.display_which_text == "chat": if self.current_room == room: self.log_window("User %s joined room %s" % (user, room)) else: s ="User %s joined room %s" % (user, room) self.log.append("\n%s %s" % (time.strftime("%H:%M:%S"), s)) else: s ="User %s joined room %s" % (user, room) self.log.append("\n%s %s" % (time.strftime("%H:%M:%S"), s)) #if self.rooms[room]: self.rooms[room][user] = data def cb_room_user_left(self, room, user): if self.display_which_text == "chat": if self.current_room == room: self.log_window("User %s left room %s" % (user, room)) else: s ="User %s left room %s" % (user, room) self.log.append("\n%s %s" % (time.strftime("%H:%M:%S"), s)) else: s ="User %s left room %s" % (user, room) self.log.append("\n%s %s" % (time.strftime("%H:%M:%S"), s)) del self.rooms[room][user] def cb_peer_status(self, user, status): if self.display_which_text == "chat": if status == 1: self.log_window("User %s went away" % user) elif status == 2: self.log_window("User %s came online" % user) elif status == 0: self.log_window("User %s is offline" % user) def cb_user_info(self, user, info, picture, uploads, queue, slotsfree): if user == self.info_requested: self.info_requested = None e = info.split('\n') for i in e: self.info_log(i) self.info_log("\nQueue: %s \tUploads: %s \tFree Slots: %s" % ( queue, uploads, slotsfree) ) if picture != '': r = file(str(user)+".image", 'w') print >> r, str(picture) r.close() self.info_log( "Saved UserImage as: "+ str(user)+".image") if self.display_which_text != "info": self.alert_status("New Userinfo") def cb_peer_address(self, user, ip, port): if user == self.ip_requested: self.ip_requested = None self.info_log("%s's IP: %s Port: %s" % (user, str(ip), str(port)) ) if self.display_which_text != "info": self.alert_status("New IP") def cb_peer_stats(self, user, avgspeed, numdownloads, numfiles, numdirs): if user == self.stat_requested and user != self.username: x = "Peer Stats for %s \nSpeed: %s \tDownloads: %s \nFiles: %s \tDirectories: %s" % (user, avgspeed, numdownloads, numfiles, numdirs) self.info_log(x) self.stat_requested = None if self.display_which_text != "info": self.alert_status("New Stats") elif user == self.username: self.stats = user, avgspeed, numdownloads, numfiles, numdirs if self.display_which_text == "setup": self.setup_mode() def cb_private_message(self, timestamp, user, message): if self.pm_user == None: self.pm_user = user if message[:4] == "/me ": message = "* %s %s" % (user, message[4:]) self.private_log("PM from: %s" % ( message)) else: self.private_log("PM from: [%s] %s" % ( user, message)) if self.display_which_text != "private": self.alert_status("New PM") else: self.set_edit_title("Send message to: " + self.pm_user) def cb_server_status_set(self, status): if status: stat = "Away" else: stat = "Online" self.onlinestatuslog.append("\n"+stat) self.onlinestatuslog = self.onlinestatuslog[-5:] self.onlinestatus.addstr(self.onlinestatuslog[-1]) self.onlinestatus.refresh() self.status = status def cb_room_ticker_set(self, room, user, message): for rooms, tickle in self.master_ticklist.items()[:]: if room == rooms: tickle[user] = message if self.display_which_text == "chat": if sections["tickers"]["tickers_enabled"] == 'yes': if message != '': self.log_window("%s set %s's ticker to %s" % (user, room, message)) def cb_search_ticket(self, query, ticket): self.s_query[ticket] = query def cb_search_results(self, ticket, user, free, speed, queue, results): # search results if self.search_visible == 1: self.search_log("---------\nSearch: " +str(self.s_query[ticket]) + " Results from: User: "+ user ) for result in results: result_list = [] # Create Result List for future use # clear it next interation result_list = ticket, user, free, speed, queue, result[0], result[1], result[2], result[3] # Count Search Result self.search_number = self.search_number +1 # Send Num of Result to Search Window self.search_status(self.search_number) # Activate Number for Result self.search_results[self.search_number] = result_list # Display Search Result if self.search_visible == 1: path = result[0] size = str(result[1]/1024)+'KB' ftype = result[2] if ftype in ('mp3', 'ogg'): if result[3] != []: bitrate = result[3][0] length = result[3][1] minutes = int(length)/60 seconds = str(length - (60 * minutes)) if len(seconds) < 2: seconds = '0' + seconds else: bitrate = 'None' minutes = '00' seconds = '00' length = 0 else: bitrate = 'None' minutes = '00' seconds = '00' length = 0 self.search_log("Num: [" +str(self.search_number)+"] Path: "+ path+ "\nSize: "+str(size)+ " Type: "+ ftype + " Bitrate: "+ str(bitrate) + " Length: " + str(minutes)+":"+seconds) def cb_user_shares(self, user, shares): if self.browse_requested == user: self.browse_requested = None self.browse_log("Browsing: " + user) self.browse_results = {} self.browse_number = 0 for dirs, files in shares.items(): result_list = [] if files != {}: self.browse_log("------\nDIR: " + dirs) for file, stats in files.items(): self.browse_number = self.browse_number +1 size= str(stats[0]/1024)+"KB" ftype =stats[1] if ftype == '': ftype = "None" length = "00:00" bitrate = 'None' else: bitrate =str(stats[2][0]) if bitrate == '': bitrate = 'None' length =str(stats[2][1]) if length != '' and length != None: minutes = int(length)/60 seconds = str( int(length) - (60 * minutes)) if len(seconds) < 2: seconds = '0' + seconds length = str(minutes)+":"+str(seconds) else: length = "00:00" filename = dirs + "\\" + file result_list = user, filename # Activate Number for Result self.browse_results[self.browse_number] = result_list self.browse_log('['+str(self.browse_number)+'] ' + " Size: " + str(size) + " Type: " + ftype + " Length: " + length + " Bitrate: " + bitrate + "\nFile: " + file) self.browse_log("Finished browsing: " + user) def cb_transfer_state(self, downloads, uploads): for users in uploads: upload = int(users[0]) user_path = (users[1], users[2]) user = users[1] path = users[2] status = int(users[3]) error = users[4] filepos = int(users[5]) filesize = int(users[6]) rate = int(users[7]) self.transfers["uploads"][user_path] = [upload, user, path, status, error, filepos, filesize, rate] for users in downloads: upload = int(users[0]) user_path = (users[1], users[2]) user = users[1] path = users[2] status = int(users[3]) error = users[4] filepos = int(users[5]) filesize = int(users[6]) rate = int(users[7]) self.transfers["downloads"][user_path] = [upload, user, path, status, error, filepos, filesize, rate] self.upload_manager() self.download_manager() def cb_transfer_update(self, downloads, uploads): upload_update = 0 for users in uploads: upload = int(users[0]) user_path = (users[1], users[2]) user = users[1] path = users[2] status = int(users[3]) error = users[4] filepos = int(users[5]) filesize = int(users[6]) rate = int(users[7]) self.transfers["uploads"][user_path] = [upload, user, path, status, error, filepos, filesize, rate] upload_update = 1 download_update = 0 for users in downloads: upload = int(users[0]) user_path = (users[1], users[2]) user = users[1] path = users[2] status = int(users[3]) error = users[4] filepos = int(users[5]) filesize = int(users[6]) rate = int(users[7]) self.transfers["downloads"][user_path] = [upload, user, path, status, error, filepos, filesize, rate] download_update = 1 if upload_update == 1: self.upload_manager() if download_update == 1: self.download_manager() def cb_transfer_remove(self, transfer): user_path = transfer[1], transfer[2] if transfer[0]: del self.transfers["uploads"][user_path] self.upload_manager() else: del self.transfers["downloads"][user_path] self.download_manager() #Add new/replace old keys to self.config def cb_config_set(self, domain, key, value): if key in self.config[domain].keys(): self.info_log("Modified <"+key+"> in <" +domain+"> to <"+value + ">") self.config[domain][key] = value else: if value == '': self.info_log("Added <"+key+"> to <" +domain+">") else: self.info_log("Added <"+key+"> to <" +domain+"> and set to <"+value+">") self.config[domain][key] = value self.display_config_update(domain) #Delete keys from self.config def cb_config_remove(self, domain, key): if key in self.config[domain].keys(): self.info_log("Removed <"+key+"> from <" +domain+">") del self.config[domain][key] if domain == "buddies": self.buddy_mode() self.display_config_update(domain) #Copy config to self.config at connection def cb_config_state(self, config): self.config = config.copy() # -- ^ Museek Messages ^ def upload_manager(self): if self.display_which_text == "transfer": if self.transfer_display_mode == 'active': status_list = (1, 2, 3, 4, 5, 6, 8, 9,) elif self.transfer_display_mode == 'all': status_list = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) elif self.transfer_display_mode == 'finished': status_list = (0, 99999) elif self.transfer_display_mode == 'queued': status_list = (7, 99999) elif self.transfer_display_mode == 'failed': status_list = ( 10, 11, 12, 13) uploadlist = [] a = 0 self.up_transfer_numbers = {} for users, vals in self.transfers["uploads"].items(): upload = vals[0] user = vals[1] path = vals[2] status = vals[3] error = vals[4] filepos = vals[5] filesize = vals[6] rate = vals[7] a += 1 username = {} username[user] = path self.up_transfer_numbers[a] = username if status in status_list: if filesize != 0: percent = str(100 * filepos / filesize) if len(percent) < 2: percent = ' ' + percent if len(percent) < 3: percent = ' ' + percent if filesize >= 1048576 and filesize <= 1073741824: filefrmt = str(filesize/1024/1024) +" MB" elif filesize < 1048576 and filesize >= 1024: filefrmt = str(filesize/1024) +" KB" elif filesize < 1024 and filesize > 0: filefrmt = str(filesize) +" B" if len(filefrmt) < 5: filefrmt = ' '+filefrmt if len(filefrmt) < 6: filefrmt = ' '+filefrmt else: percent = ' 0' filefrmt = '0 Bits' if len(user) <2 : spacer = "\t\t" else: spacer = "\t" if len(states[status]) <8: spacer2 = "\t\t" else: spacer2 = "\t" #self.upwin.addstr ae = str(a) while len(ae) < 4: ae = ' '+ae while len(user[:10]) < 10: user += " " mo = {} ea = "\n[%s|%s%%|%s] [%s]%s%s%s%s" % (str(ae), percent , filefrmt , user[:10], spacer, states[status], spacer2, path[-self.w+51:]) mo = ea, status uploadlist.append(mo) self.window_height =self.h/2-4 if self.transferscroll == "upload": if self.scrollup > 0: self.scrollup = 0 if self.scrollup > len(uploadlist): self.scrollup = len(uploadlist) end = len(uploadlist) + self.scrollup if end < self.window_height -1: end == self.window_height -1 if end < 0: end = 0 start = end - self.window_height +1 if start < 0: start = 0 end = self.window_height -1 self.scrollup = -(len(uploadlist) - end) else: end = len(uploadlist) start = end - self.window_height +1 if start < 0: start = 0 self.upwin.clear() self.upwin.addstr("[Numb|Perc| Size ] [Username]\t[Status]\t[Path]", curses.color_pair(5)) if uploadlist != []: for transfers in uploadlist[start:end]: if transfers[1] == 1: attr = curses.color_pair(5) elif transfers[1] == 0: attr = curses.color_pair(9) elif transfers[1] in (10, 11, 12, 13, 14): attr = curses.color_pair(1) else: attr = curses.color_pair(0) self.upwin.addstr(transfers[0], attr) else: self.upwin.addstr("\nNo transfers in this category, hit INSERT to switch to another.") self.upwin.refresh() self.upload_status(str(len(self.transfers["uploads"].keys()))) def download_manager(self): if self.display_which_text == "transfer": if self.transfer_display_mode == 'active': status_list = (1, 2, 3, 4, 5, 6, 8, 9,) elif self.transfer_display_mode == 'all': status_list = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) elif self.transfer_display_mode == 'finished': status_list = (0, 99999) elif self.transfer_display_mode == 'queued': status_list = (7, 99999) elif self.transfer_display_mode == 'failed': status_list = ( 10, 11, 12, 13) downloadlist = [] a = 0 self.down_transfer_numbers = {} for users, vals in self.transfers["downloads"].items(): download = vals[0] user = vals[1] path = vals[2] status = vals[3] error = vals[4] filepos = vals[5] filesize = vals[6] rate = vals[7] a += 1 username = {} username[user] = path self.down_transfer_numbers[a] = username if status in status_list: if filesize != 0: percent = str(100 * filepos / filesize) if len(percent) < 2: percent = ' ' + percent if len(percent) < 3: percent = ' ' + percent if filesize >= 1048576 and filesize <= 1073741824: filefrmt = str(filesize/1024/1024) +" MB" elif filesize < 1048576 and filesize >= 1024: filefrmt = str(filesize/1024) +" KB" elif filesize < 1024 and filesize > 0: filefrmt = str(filesize) +" B" if len(filefrmt) < 5: filefrmt = ' '+filefrmt if len(filefrmt) < 6: filefrmt = ' '+filefrmt else: percent = ' 0' filefrmt = '0 Bits' if len(user) <2 : spacer = "\t\t" else: spacer = "\t" if len(states[status]) <8: spacer2 = "\t\t" else: spacer2 = "\t" #self.downwin.addstr ae = str(a) while len(ae) < 4: ae = ' '+ae mo = {} while len(user[:10]) < 10: user += " " ea = "\n[%s|%s%%|%s] [%s]%s%s%s%s" % (str(ae), percent , filefrmt , user[:10], spacer, states[status], spacer2, path[-self.w+51:]) mo = ea, status downloadlist.append(mo) self.window_height =self.downtext if self.transferscroll == "download": if self.scrollup > 0: self.scrollup = 0 if self.scrollup > len(downloadlist): self.scrollup = len(downloadlist) end = len(downloadlist) + self.scrollup if end < self.window_height -1: end == self.window_height -1 if end < 0: end = 0 start = end - self.window_height +1 if start < 0: start = 0 end = self.window_height -1 self.scrollup = -(len(downloadlist) - end) else: end = len(downloadlist) start = end - self.window_height +1 if start < 0: start = 0 self.downwin.clear() self.downwin.addstr("[Numb|Perc| Size ] [Username]\t[Status]\t[Path]", curses.color_pair(5)) if downloadlist != []: for transfers in downloadlist[start:end]: if transfers[1] == 1: attr = curses.color_pair(5) elif transfers[1] == 0: attr = curses.color_pair(9) elif transfers[1] in (10, 11, 12, 13, 14): attr = curses.color_pair(1) else: attr = curses.color_pair(0) self.downwin.addstr(transfers[0], attr) else: self.downwin.addstr("\nNo transfers in this category, hit INSERT to switch to another.") self.downwin.refresh() self.download_status(str(len(self.transfers["downloads"].keys()))) def display_config_update(self, domain): if domain == "buddies" and self.display_which_text == "buddies": self.buddy_mode() elif domain == "banned" and self.display_which_text == "banned": self.ban_mode() elif domain == "ignored" and self.display_which_text == "ignored": self.ignore_mode() elif domain == "transfers" and self.display_which_text == "setup": self.setup_mode() # Change Room Title in edit window def set_room(self, r): self.current_room = r self.current = r if self.display_which_text == "chat": self.inputwin.clear() self.inputwin.border() self.inputwin.addstr(0, 2, "[ "+self.current_room+" ]", curses.color_pair(5) | curses.A_BOLD) self.inputwin.addstr(0, self.w-9, ">>>>>>>", curses.color_pair(5) | curses.A_BOLD) self.inputwin.refresh() self.editwin.refresh() self.textwin.clear() if self.roomlogs[self.current_room] != None: for lines in self.roomlogs[self.current_room]: if lines[0:1] == 'M': try: self.textwin.addstr('\n'+lines[1:], curses.color_pair(5) | curses.A_BOLD) except: self.textwin.refresh() elif lines[0:1] == 'R': try: self.textwin.addstr('\n'+lines[1:], curses.color_pair(1) | curses.A_BOLD) except: self.textwin.refresh() elif lines[0:1] == 'N': try: self.textwin.addstr('\n'+lines[1:]) except: self.textwin.refresh() else: try: self.textwin.addstr(lines[1], self.w-2) except: self.textwin.refresh() self.textwin.refresh() if "\n%s" % self.current_room == self.alertwinlog: self.alert_status("\n") self.scrollup_static = len(self.roomlogs[self.current_room]) self.scrollup = 0 #len(self.roomlogs[self.current_room]) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.addstr(0, 3, "[ Chat Rooms ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(1, self.w-1, "^", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-13, self.w-1, "v", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-12, self.w-18, "[ "+str(abs(self.scrollup))+"/"+str(self.scrollup_static)+" ]", curses.A_BOLD) self.chatwin.attroff(curses.color_pair(5)) self.chatwin.refresh() self.textwin.refresh() def set_edit_title(self, r): self.current = r if self.display_which_text != "chat": self.inputwin.border() if self.current: self.inputwin.addstr(0, 2, "[ "+self.current+" ]", curses.color_pair(5) | curses.A_BOLD) self.inputwin.refresh() self.editwin.refresh() # Rebuild Buddylist from self.config def buddylist(self): if "buddies" in self.config.keys(): self.buddylog = [] alpha_list = SortedDict() for keyname, keyvalue in self.config["buddies"].items(): alpha_list[keyname] = keyvalue self.chatwin.addstr(self.h-6, self.w-18, "[ "+str(len(alpha_list.keys()))+" ]", curses.A_BOLD) self.chatwin.refresh() for keyname, keyvalue in alpha_list.items(): banned = None ignored = None tabbedname = keyname while len(tabbedname) < 25: tabbedname += " " tabs = "\t" for bdomain, bkey in self.config.items()[:]: if bdomain == "banned": for bkeyname, bkeyvalue in bkey.items(): if keyname == bkeyname: banned = 1 elif bdomain == "ignored": for bkeyname, bkeyvalue in bkey.items(): if keyname == bkeyname: ignored = 1 if banned != None: self.buddy_log("B", tabbedname[:25] +"|"+tabs+ keyvalue) elif ignored != None: self.buddy_log("I", tabbedname[:25] +"|"+tabs+ keyvalue) else: self.buddy_log("N", tabbedname[:25] +"|"+tabs+ keyvalue) # Rebuild Banlist from self.config def banlist(self): if "banned" in self.config.keys(): self.banlog = [] alpha_list = SortedDict() for keyname, keyvalue in self.config["banned"].items(): alpha_list[keyname] = keyvalue self.chatwin.addstr(self.h-6, self.w-18, "[ "+str(len(alpha_list.keys()))+" ]", curses.A_BOLD) self.chatwin.refresh() for keyname, keyvalue in alpha_list.items(): tabbedname = keyname while len(tabbedname) < 25: tabbedname += " " tabs = "\t" self.ban_log(tabbedname[:25] +"|"+tabs+ keyvalue) # Rebuild Ignorelist from self.config def ignorelist(self): if "ignored" in self.config.keys(): self.ignorelog = [] alpha_list = SortedDict() for keyname, keyvalue in self.config["ignored"].items(): alpha_list[keyname] = keyvalue self.chatwin.addstr(self.h-6, self.w-18, "[ "+str(len(alpha_list.keys()))+" ]", curses.A_BOLD) self.chatwin.refresh() for keyname, keyvalue in alpha_list.items(): tabbedname = keyname while len(tabbedname) < 25: tabbedname += " " tabs = "\t" self.ignore_log(tabbedname[:25] +"|"+tabs+ keyvalue) def scrolltext(self): key = self.key color_added = None if self.display_which_text != "transfer": self.textwin.clear() self.textwin.refresh() if self.display_which_text == "chat": self.window_height = -(self.h-13) self.textwin.scrollok(0) else: self.window_height = -(self.h-7) self.textwin.scrollok(1) if self.display_which_text == "chat": selected_log = self.roomlogs[self.current_room] elif self.display_which_text == "search": selected_log = self.searchlog elif self.display_which_text == "info": selected_log = self.infolog elif self.display_which_text == "private": selected_log = self.privatelog elif self.display_which_text == "browse": selected_log = self.browselog elif self.display_which_text == "buddies": selected_log = self.buddylog color_added = curses.color_pair(5) elif self.display_which_text == "banned": selected_log = self.banlog color_added = curses.color_pair(1) elif self.display_which_text == "ignored": selected_log = self.ignorelog color_added = curses.color_pair(2) if key == "KEY_UP": # SCROLLING UP # Redisplay chat log with one less line every time the Up key is pressed self.scrollup = self.scrollup -1 elif key == "KEY_DOWN": #SCROLLING DOWN self.textwin.scrollok(1) self.scrollup = self.scrollup +1 elif key == "KEY_PPAGE": self.scrollup = self.scrollup -10 elif key == "KEY_NPAGE": self.textwin.scrollok(1) self.scrollup = self.scrollup +10 log_scroll = [] for line in selected_log: log_scroll.append(line) if self.scrollup > 0: self.scrollup = 0 elif self.scrollup < -len(log_scroll): self.scrollup = -len(log_scroll) - self.window_height elif self.scrollup < -len(log_scroll)-self.window_height: self.scrollup = -len(log_scroll)-self.window_height elif abs(self.scrollup) >= len(log_scroll): self.scrollup = -len(log_scroll) - self.window_height end = len(log_scroll) +self.scrollup start = end +self.window_height if start <= 0: start = 0 if self.display_which_text == "chat": #start -= 1 self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.addstr(1, self.w-1, "^", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-13, self.w-1, "v", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-12, self.w-18, "[ "+str(self.scrollup)+"/"+str(len(log_scroll))+" ]", curses.A_BOLD) #"+str(end)+" "+str(start)+" self.chatwin.addstr(0, 3, "[ Chat Rooms ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.attroff(curses.color_pair(5)) self.chatwin.refresh() for lines in log_scroll[start:end]: if lines[0:1] == 'M': try: self.textwin.addstr('\n'+lines[1:], curses.color_pair(5) | curses.A_BOLD) except: self.textwin.refresh() elif lines[0:1] == 'R': try: self.textwin.addstr('\n'+lines[1:], curses.color_pair(1) | curses.A_BOLD) except: self.textwin.refresh() elif lines[0:1] == 'N': try: self.textwin.addstr('\n'+lines[1:]) except: try: self.textwin.addstr('\n'+lines[1:self.w-3], curses.color_pair(5) | curses.A_BOLD) except: self.textwin.refresh() else: try: self.textwin.addstr(lines[1], self.w-2) except: self.textwin.refresh() self.textwin.refresh() else: for lines in log_scroll[start:end]: if color_added != None: if self.display_which_text == "buddies": if lines[0:1] == 'I': self.textwin.addstr(lines[1:], curses.color_pair(2) | curses.A_BOLD) elif lines[0:1] == 'B': self.textwin.addstr(lines[1:], curses.color_pair(1) | curses.A_BOLD) elif lines[0:1] == 'N': self.textwin.addstr(lines[1:]) else: self.textwin.addstr(lines) else: self.textwin.addstr(lines, color_added | curses.A_BOLD) else: self.textwin.addstr(lines) self.textwin.refresh() if self.display_which_text == "transfer": if self.transferscroll == "upload": scrolldiff = self.uptext elif self.transferscroll == "download": scrolldiff = self.downtext if key == "KEY_UP": # SCROLLING UP # Redisplay chat log with one less line every time # the Up key is pressed self.scrollup = self.scrollup -1 elif key == "KEY_DOWN": #SCROLLING DOWN self.scrollup = self.scrollup +1 elif key == "KEY_PPAGE": # upload or download window height - one line for heading self.scrollup = self.scrollup -scrolldiff +1 elif key == "KEY_NPAGE": self.scrollup = self.scrollup + scrolldiff -1 if self.scrollup > 0: self.scrollup = 0 if self.transferscroll == "upload": self.upload_manager() elif self.transferscroll == "download": self.download_manager() self.key = None # ---v KEYS v def escaped(self, key, line): if key in ("KEY_UP", "KEY_DOWN", "KEY_PPAGE", "KEY_NPAGE"): #if self.display_which_text not in ("setup", "transfer"): self.key = key self.scrolltext() elif key == "KEY_F(1)": self.chat_mode() elif key == "KEY_F(2)": self.private_mode() elif key == "KEY_F(3)": self.transfer_mode() elif key == "KEY_F(4)": self.search_mode() elif key == "KEY_F(5)": self.info_mode() elif key == "KEY_F(6)": self.browse_mode() elif key == "KEY_F(7)": self.buddy_mode() elif key == "KEY_F(8)": self.ban_mode() elif key == "KEY_F(9)": self.ignore_mode() elif key == "KEY_F(10)": self.setup_mode() elif key == chr(9): # Tab completion if self.display_which_text in ("chat", "buddies", "banned", "ignored", "info", "private", "browse", "transfer"): if self.display_which_text == "chat": tab_complete_list = self.rooms[self.current] elif self.display_which_text == "buddies": tab_complete_list = self.config["buddies"].keys() elif self.display_which_text == "banned": tab_complete_list = self.config["banned"].keys() elif self.display_which_text == "ignored": tab_complete_list = self.config["ignored"].keys() elif self.display_which_text in ("info", "private", "browse", "transfer"): usercompletionlist = {} for users in self.config["buddies"].keys(): usercompletionlist[users] = 0 for users in self.config["banned"].keys(): usercompletionlist[users] = 0 for users in self.config["ignored"].keys(): usercompletionlist[users] = 0 for room in self.rooms.keys(): for users in self.rooms[room].keys(): usercompletionlist[users] = 0 for userpath, values in self.transfers["uploads"].items(): usercompletionlist[values[1]] = 0 for userpath, values in self.transfers["downloads"].items(): usercompletionlist[values[1]] = 0 tab_complete_list = usercompletionlist.keys() command = False if line.startswith('/'): x = line.split(' ') if len(x) == 1: tab_complete_list = self.commandlist command = True for words in tab_complete_list: z = line.split(' ') if words.startswith(z[-1]) and z[-1] != ' ' and z[-1] != '' and len(words) != len(z[0]): line = '' r = len(z) if r >1: for s in z: if s != z[-1]: line = line + s +" " elif s == z[-1]: if self.display_which_text == "chat": line = line + words+" " else: line = line + words break else: if self.display_which_text == "chat": if command == False: line = line + words+": " else: line = line + words else: line = line + words break break self.edit = editor(self.editwin, self.escaped, self.textwin, line) # self.stdscr.nodelay(1) elif key in ("KEY_HOME", "KEY_END"): if self.display_which_text == "transfer": # Tab to switch between upload and download scrolling if self.transferscroll == "upload": self.transferscroll="download" self.scrollup =0 elif self.transferscroll=="download": self.transferscroll="upload" self.scrollup =0 self.transfer_mode() elif key == "KEY_MOUSE": (id,x,y,z,event)=curses.getmouse() #print id,x,y,z,event if y >= self.h-1: # clickable mode switching if x >= 0 and x < 7: self.chat_mode() elif x >= 7 and x < 16: self.private_mode() elif x >= 16 and x < 27: self.transfer_mode() elif x >= 27 and x < 34: self.search_mode() elif x >= 34 and x < 40: self.info_mode() elif x >= 40 and x < 48: self.browse_mode() elif x >= 48 and x < 55: self.buddy_mode() elif x >= 55 and x < 60: self.ban_mode() elif x >= 60 and x < 68: self.ignore_mode() elif x >= 68 and x < 75: self.setup_mode() if self.display_which_text == "chat": # Clickable room switch if y == self.h-3 or y == self.h-4: if x >=self.w-9 and x < self.w-1: if not self.current_room in self.joined: ix = 0 else: ix = self.joined.index(self.current_room) ix += 1 if ix < 0: ix = -1 elif ix >= len(self.joined): ix = 0 self.set_room(self.joined[ix]) elif y in (self.h-6, self.h-7, self.h-8, self.h-9) and x >= self.w-5: self.key = "KEY_NPAGE" self.scrolltext() elif y in (7, 8, 9, 10) and x >= self.w-5: self.key = "KEY_PPAGE" self.scrolltext() elif self.display_which_text == "setup": if y == 8: if x >=1 and x <=15: #Buddies-only if self.config["transfers"]["only_buddies"] == "true": self.send(messages.ConfigSet("transfers", "only_buddies", "false")) elif self.config["transfers"]["only_buddies"] == "false": self.send(messages.ConfigSet("transfers", "only_buddies", "true")) elif x >=17 and x <=31: #buddy-privs if self.config["transfers"]["privilege_buddies"] == "true": self.send(messages.ConfigSet("transfers", "privilege_buddies", "false")) elif self.config["transfers"]["privilege_buddies"] == "false": self.send(messages.ConfigSet("transfers", "privilege_buddies", "true")) elif y == 11: if x >=1 and x <=15: # Toggle Autobuddy if sections["mucous"]["autobuddy"] == "yes": sections["mucous"]["autobuddy"] = "no" elif sections["mucous"]["autobuddy"] == "no": sections["mucous"]["autobuddy"] = "yes" self.setup_mode() elif x >=17 and x <=31: #slots self.setup_mode() elif self.display_which_text == "search": if y ==self.h-4: if x >= 10 and x <= 20: if self.search_type == "globally": self.search_type = "buddies" elif self.search_type == "buddies": self.search_type = "globally" self.search_mode() elif self.display_which_text == "transfer": # Clickable transfer type switcher if y ==self.h-5: if x >=self.w-18: if self.transfer_display_mode == 'active': self.transfer_display_mode = 'queued' elif self.transfer_display_mode == 'queued': self.transfer_display_mode = 'finished' elif self.transfer_display_mode == 'finished': self.transfer_display_mode = 'all' elif self.transfer_display_mode == 'all': self.transfer_display_mode = 'failed' elif self.transfer_display_mode == 'failed': self.transfer_display_mode = 'active' self.transfer_mode() if key == "KEY_LEFT" or key == chr(91) or key == chr(34) or key == "KEY_RIGHT" or key == chr(93) or key == chr(35) or key == "KEY_IC": if not self.joined: return if self.display_which_text == "chat": # Hotkeys to switch rooms if not self.current_room in self.joined: if key == "KEY_LEFT" or key == chr(91) or key == chr(34): ix = -1 elif key == "KEY_RIGHT" or key == chr(93) or key == chr(35) or key == "KEY_IC": ix = 0 else: ix = self.joined.index(self.current_room) if key == "KEY_LEFT" or key == chr(91) or key == chr(34): ix -= 1 elif key == "KEY_RIGHT" or key == chr(93) or key == chr(35) or key == "KEY_IC": ix += 1 if ix < 0: ix = -1 elif ix >= len(self.joined): ix = 0 if ix != None: self.set_room(self.joined[ix]) elif self.display_which_text == "transfer": # Hotkeys to switch listing transfer types if self.transfer_display_mode == 'active': self.transfer_display_mode = 'queued' elif self.transfer_display_mode == 'queued': self.transfer_display_mode = 'finished' elif self.transfer_display_mode == 'finished': self.transfer_display_mode = 'all' elif self.transfer_display_mode == 'all': self.transfer_display_mode = 'failed' elif self.transfer_display_mode == 'failed': self.transfer_display_mode = 'active' self.transfer_mode() elif self.display_which_text == "search": # Hotkeys to switch types of searches if self.search_type == "globally": self.search_type = "buddies" elif self.search_type == "buddies": self.search_type = "globally" self.search_mode() else: self.set_edit_title(self.current) # ---^ KEYS ^ # ---v MODES v def chat_mode(self): self.display_which_text = "chat" self.hotkeys() self.chatwin = curses.newwin(self.h - 10 -1, self.w, 7, 0, ) self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-12 -1,self.w-2,8,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 0 self.scrollup = 0 self.textwin.refresh() if self.alertwinlog in ( "\nNew Chat", "\nNick Mention"): self.alert_status("\n") self.borderlogwin = curses.newwin(6, self.w, 1, 0) self.borderlogwin.border() self.borderlogwin.addstr(0, 3, "[ Online Status Log ]", curses.color_pair(5) | curses.A_BOLD) self.borderlogwin.refresh() self.logwin = self.borderlogwin.subwin(4, self.w -2, 2, 1) self.logwin.scrollok(1) self.logwin.idlok(1) for i in range(4): self.logwin.addstr(self.log[-(4 - i)]) self.logwin.refresh() if self.current_room != None: self.set_room(self.current_room) def private_mode(self): self.display_which_text = "private" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.border() self.chatwin.addstr(0, 3, "[ Private Chat ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 2000 self.scrollup = self.scrollup_static for lines in self.privatelog: self.textwin.addstr(lines) self.textwin.refresh() if self.pm_user != None: self.set_edit_title("Send message to: " + self.pm_user) else: self.set_edit_title("Set a user to Private Message") if self.alertwinlog == "\nNew PM": self.alert_status(" ") def transfer_mode(self): self.display_which_text = "transfer" self.hotkeys() # Draw upload border self.upwinheight = self.h/2-2 self.transwin = curses.newwin(self.upwinheight, self.w, 1, 0) if self.transferscroll == "upload": self.transwin.attron(curses.color_pair(5)) self.transwin.border() self.transwin.addstr(0, 3, "[ Uploading Transfers ]", curses.color_pair(5) | curses.A_BOLD) self.transwin.attroff(curses.color_pair(5)) else: self.transwin.border() self.transwin.addstr(0, 3, "[ Uploading Transfers ]", curses.A_BOLD) #+str(self.h) +'H '+ str(self.w)+'W ' + str(self.upwinheight ) #resize debugging self.transwin.refresh() # Draw upload window self.uptext = self.h/2-4 self.upwin = self.transwin.subwin(self.h/2-4,self.w-2,2,1) self.upwin.scrollok(1) self.upwin.idlok(1) self.upwin.refresh() # Draw download border self.downwinheight = self.h -self.upwinheight -5 # Magic! :) self.trans2win = curses.newwin(self.downwinheight , self.w, self.h/2 -1, 0) if self.transferscroll == "download": self.trans2win.attron(curses.color_pair(5)) self.trans2win.border() self.trans2win.addstr(0, 3, "[ Downloading Transfers ]", curses.A_BOLD|curses.color_pair(5)) self.trans2win.attroff(curses.color_pair(5)) else: self.trans2win.border() self.trans2win.addstr(0, 3, "[ Downloading Transfers ]", curses.A_BOLD) self.trans2win.addstr(self.downwinheight-1, self.w-18, "[ "+self.transfer_display_mode.capitalize()+" ]", curses.A_BOLD) self.trans2win.refresh() # Draw download window self.downtext = self.downwinheight -2 self.downwin = self.trans2win.subwin(self.downtext,self.w-2,self.h/2,1) self.downwin.scrollok(1) self.downwin.idlok(1) self.scrollup_static = 0 self.scrollup = self.scrollup_static self.downwin.refresh() self.set_edit_title("Modify Transfers") self.upload_manager() self.download_manager() def browse_mode(self): self.display_which_text = "browse" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Browse users ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 5000 self.scrollup = self.scrollup_static for lines in self.browselog: self.textwin.addstr(lines) self.textwin.refresh() self.set_edit_title("Browse users' files") def search_mode(self): self.display_which_text = "search" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Search ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 5000 self.scrollup = self.scrollup_static for lines in self.searchlog: self.textwin.addstr("\n"+lines) self.textwin.refresh() if self.search_type != None: self.set_edit_title("Search "+self.search_type.capitalize()+" for:") def info_mode(self): self.display_which_text = "info" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Info Mode ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 0 self.scrollup = self.scrollup_static for lines in self.infolog: self.textwin.addstr(lines) self.textwin.refresh() self.set_edit_title("Get info about user:") if self.alertwinlog in ("\nNew Userinfo", "\nNew IP", "\nNew Stats"): self.alert_status("\n") def buddy_mode(self): self.display_which_text = "buddies" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Buddy Mode ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.refresh() self.buddylist() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 1000 self.scrollup = self.scrollup_static for lines in self.buddylog: if lines[0:1] == 'I': self.textwin.addstr(lines[1:], curses.color_pair(2) | curses.A_BOLD) elif lines[0:1] == 'B': self.textwin.addstr(lines[1:], curses.color_pair(1) | curses.A_BOLD) elif lines[0:1] == 'N': self.textwin.addstr(lines[1:]) else: self.textwin.addstr(lines[1:]) self.textwin.refresh() self.set_edit_title("Add Buddy") def ban_mode(self): self.display_which_text = "banned" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Ban Mode ]", curses.color_pair(5) | curses.A_BOLD) self.banlist() self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 1000 self.scrollup = self.scrollup_static for lines in self.banlog: self.textwin.addstr(lines, curses.color_pair(1) | curses.A_BOLD ) self.textwin.refresh() self.set_edit_title("Add User to Ban List:") def ignore_mode(self): self.display_which_text = "ignored" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Ignore Mode ]", curses.color_pair(5) | curses.A_BOLD) self.ignorelist() self.chatwin.refresh() self.textwin = self.chatwin.subwin(self.h-6 -1,self.w-2,2,1) self.textwin.scrollok(1) self.textwin.idlok(1) self.scrollup_static = 1000 self.scrollup = self.scrollup_static for lines in self.ignorelog: self.textwin.addstr(lines, curses.color_pair(2) | curses.A_BOLD) self.textwin.refresh() self.set_edit_title("Add User to Ignore List") def setup_mode(self): self.display_which_text = "setup" self.hotkeys() self.chatwin = curses.newwin(self.h - 4 -1, self.w, 1, 0) self.chatwin.clear() self.chatwin.refresh() # Interface self.buttonwin = curses.newwin(3,32,1,0) self.buttonwin.border() self.buttonwin.addstr(0, 1, "[ Interface ]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin.refresh() self.inbuttonwin = self.buttonwin.subwin(1,30,2,1) self.inbuttonwin.scrollok(1) if self.host != None: self.inbuttonwin.addstr(self.host, curses.color_pair(3) ) self.inbuttonwin.refresh() # Your stats self.bwin = curses.newwin(6,32,1,33) self.bwin.border() self.bwin.addstr(0, 1, "[ Stats]", curses.color_pair(5) | curses.A_BOLD) self.bwin.refresh() self.inbwin = self.bwin.subwin(1,30,2,34) self.inbwin2 = self.bwin.subwin(1,30,3,34) self.inbwin3 = self.bwin.subwin(1,30,4,34) self.inbwin4 = self.bwin.subwin(1,30,5,34) self.inbwin.scrollok(1) self.inbwin2.scrollok(1) self.inbwin3.scrollok(1) self.inbwin4.scrollok(1) if self.stats != []: self.inbwin.addstr("Files: "+str(self.stats[3]), curses.color_pair(3) ) self.inbwin2.addstr("Dirs: "+str(self.stats[4]), curses.color_pair(3) ) self.inbwin3.addstr("Downloads: "+str(self.stats[2]), curses.color_pair(3) ) self.inbwin4.addstr("Average speed: "+str(self.stats[1]), curses.color_pair(3) ) #self.stats = user, avgspeed, numdownloads, numfiles, numdirs else: if self.username != None: self.send(messages.PeerStats(self.username)) self.inbwin.refresh() self.inbwin2.refresh() self.inbwin3.refresh() self.inbwin4.refresh() self.buttonwin2 = curses.newwin(3,32,4,0) self.buttonwin2.border() self.buttonwin2.addstr(0, 1, "[ Interface Password ]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin2.refresh() self.inbuttonwin2 = self.buttonwin2.subwin(1,30,5,1) self.inbuttonwin2.scrollok(1) if self.password != None: if self.unhide=="true": self.inbuttonwin2.addstr(self.password) else: self.inbuttonwin2.addstr("*********") else: self.inbuttonwin2.addstr("NOT set") self.inbuttonwin2.refresh() self.buttonwin3 = curses.newwin(3,16,7,0) self.buttonwin3.border() self.buttonwin3.addstr(0, 1, "[Buddies-Only]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin3.refresh() self.inbuttonwin3 = self.buttonwin3.subwin(1,15,8,1) self.inbuttonwin3.scrollok(1) if self.config != {}: self.inbuttonwin3.addstr(self.config["transfers"]["only_buddies"]) self.inbuttonwin3.refresh() self.buttonwin4 = curses.newwin(3,16,7,16) self.buttonwin4.border() self.buttonwin4.addstr(0, 1, "[Buddy Privs]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin4.refresh() self.inbuttonwin4 = self.buttonwin4.subwin(1,15,8,17) self.inbuttonwin4.scrollok(1) if self.config != {}: self.inbuttonwin4.addstr(self.config["transfers"]["privilege_buddies"]) self.inbuttonwin4.refresh() self.buttonwin5 = curses.newwin(3,16,10,0) self.buttonwin5.border() self.buttonwin5.addstr(0, 1, "[Auto-Buddy]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin5.refresh() self.inbuttonwin5 = self.buttonwin5.subwin(1,15,11,1) self.inbuttonwin5.scrollok(1) if sections["mucous"]["autobuddy"] != None: self.inbuttonwin5.addstr(sections["mucous"]["autobuddy"]) self.inbuttonwin5.refresh() self.buttonwin6 = curses.newwin(3,16,10,16) self.buttonwin6.border() self.buttonwin6.addstr(0, 1, "[ Slots ]", curses.color_pair(5) | curses.A_BOLD) self.buttonwin6.refresh() self.inbuttonwin6 = self.buttonwin6.subwin(1,15,11,17) self.inbuttonwin6.scrollok(1) if self.config != {}: self.inbuttonwin6.addstr(self.config["transfers"]["upload_slots"]) self.inbuttonwin6.refresh() self.set_edit_title("Setup") def hotkeys(self): self.bottomwin = curses.newwin(1, self.w-1, self.h-1, 0) self.bottomwin.addstr(" 1") if self.display_which_text == "chat": self.bottomwin.addstr("Chat", curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Chat", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 2") if self.display_which_text == "private": self.bottomwin.addstr("Private",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Private", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 3") if self.display_which_text == "transfer": self.bottomwin.addstr("Transfers",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Transfers", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 4") if self.display_which_text == "search": self.bottomwin.addstr("Search",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Search", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 5") if self.display_which_text == "info": self.bottomwin.addstr("Info",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Info", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 6") if self.display_which_text == "browse": self.bottomwin.addstr("Browse",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Browse", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 7") if self.display_which_text == "buddies": self.bottomwin.addstr("Buddy",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Buddy", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 8") if self.display_which_text == "banned": self.bottomwin.addstr("Ban",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Ban", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr(" 9") if self.display_which_text == "ignored": self.bottomwin.addstr("Ignore",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Ignore", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.addstr("10") if self.display_which_text == "setup": self.bottomwin.addstr("Setup",curses.A_REVERSE | curses.color_pair(7)) else: self.bottomwin.addstr("Setup", curses.A_REVERSE | curses.color_pair(8)) self.bottomwin.refresh() # ---^ MODES ^ # --- TEXT PLACEMENT v def say(self, mtype, room, message): if room != None: self.roomlogs[room].append("%s%s %s" % (mtype, time.strftime("%H:%M:%S"), message)) else: room = self.current_room self.roomlogs[room].append("%s%s %s" % (mtype, time.strftime("%H:%M:%S"), message)) if self.display_which_text == "chat": if room == self.current_room: self.chatwin.attron(curses.color_pair(5)) self.chatwin.border() self.chatwin.addstr(1, self.w-1, "^", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-13, self.w-1, "v", curses.color_pair(5) | curses.A_BOLD) self.chatwin.attroff(curses.color_pair(5)) self.chatwin.addstr(0, 3, "[ Chat Rooms ]", curses.color_pair(5) | curses.A_BOLD) self.chatwin.addstr(self.h-12, self.w-18, "[ "+str(abs(self.scrollup))+"/"+str(self.scrollup_static)+" ]", curses.A_BOLD) self.chatwin.refresh() self.textwin.scrollok(1) if mtype == "M": try: self.textwin.addstr("\n"+self.roomlogs[room][-1][1:], curses.color_pair(5) | curses.A_BOLD) except: self.textwin.refresh() elif mtype == "R": try: self.textwin.addstr("\n"+self.roomlogs[room][-1][1:], curses.color_pair(1) | curses.A_BOLD) except: self.textwin.refresh() elif mtype == "N": try: self.textwin.addstr("\n"+self.roomlogs[room][-1][1:] ) except: self.textwin.refresh() self.textwin.refresh() self.scrollup_static = len(self.roomlogs[self.current_room]) def private_log(self, s): self.privatelog.append("\n%s %s " % (time.strftime("%H:%M:%S"), s)) #self.privatelog = self.privatelog[-2000:] if self.display_which_text == "private": self.textwin.addstr(self.privatelog[-1]) self.textwin.refresh() def info_log(self, s): self.infolog.append("\n%s" % s) #self.infolog = self.infolog[-5000:] if self.display_which_text == "info": self.textwin.addstr(self.infolog[-1], curses.A_BOLD) self.textwin.refresh() def buddy_log(self, S, s): self.buddylog.append("%s\n%s" % (S, s)) def ban_log(self, s): self.banlog.append("\n%s" % s) def ignore_log(self, s): self.ignorelog.append("\n%s" % s) def log_window(self, s): self.log.append("\n%s %s" % (time.strftime("%H:%M:%S"), s)) #self.log = self.log[-len(self.log):] self.logwin.addstr(self.log[-1]) self.logwin.refresh() def search_log(self, s): self.searchlog.append("\n%s" % s) if self.display_which_text == "search": self.textwin.addstr("\n"+self.searchlog[-1]) self.textwin.refresh() def browse_log(self, s): self.browselog.append("\n%s" % s) if self.display_which_text == "browse": self.textwin.addstr(self.browselog[-1]) self.textwin.refresh() def uptransfer_log(self, s): self.uptransferlog.append("\n%s" % s) if self.display_which_text == "transfer": self.upwin.addstr(self.uptransferlog[-1]) self.upwin.refresh() def downtransfer_log(self, s): self.downtransferlog.append("\n%s" % s) if self.display_which_text == "transfer": self.downwin.addstr(self.downtransferlog[-1]) self.downwin.refresh() def search_status(self, s): self.searchwinlog.append("\nResults: %s" % s) self.searchwinlog = self.searchwinlog[-1:] self.searchwin.addstr(self.searchwinlog[-1], curses.A_UNDERLINE) self.searchwin.refresh() def upload_status(self, s): self.uploadlog.append("\nUp: %s" % s) self.uploadlog = self.uploadlog[-5:] self.uploadwin.addstr(self.uploadlog[-1], curses.A_UNDERLINE) self.uploadwin.refresh() def download_status(self, s): self.downloadlog.append("\nDown: %s" % s) self.downloadlog = self.downloadlog[-5:] self.downloadwin.addstr(self.downloadlog[-1], curses.A_UNDERLINE) self.downloadwin.refresh() def alert_status(self, s): self.alertwinlog = "\n%s" % s[:14] self.alertwin.addstr(self.alertwinlog, curses.color_pair(1) | curses.A_UNDERLINE) self.alertwin.refresh() # --- TEXT PLACEMENT ^ c = mucous() line = "" try: while 1: stdscr = curses.initscr() curses.start_color() curses.mousemask(curses.BUTTON1_PRESSED) if curses.has_colors() == True: try: curses.use_default_colors() curses.can_change_color() curses.init_pair(1, curses.COLOR_RED, -1) curses.init_pair(2, curses.COLOR_YELLOW, -1) curses.init_pair(3, curses.COLOR_CYAN, -1) curses.init_pair(4, curses.COLOR_BLUE, -1) curses.init_pair(5, curses.COLOR_GREEN, -1) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_WHITE) curses.init_pair(7, curses.COLOR_GREEN, curses.COLOR_BLACK) curses.init_pair(8, curses.COLOR_CYAN, -1) curses.init_pair(9, curses.COLOR_MAGENTA, -1) except AttributeError: curses.init_pair(1, curses.COLOR_RED, 0) curses.init_pair(2, curses.COLOR_YELLOW, 0) curses.init_pair(3, curses.COLOR_CYAN, 0) curses.init_pair(4, curses.COLOR_BLUE, 0) curses.init_pair(5, curses.COLOR_GREEN, 0) curses.init_pair(6, curses.COLOR_BLACK, curses.COLOR_WHITE) curses.init_pair(7, curses.COLOR_GREEN, curses.COLOR_BLACK) curses.init_pair(8, curses.COLOR_CYAN, curses.COLOR_BLACK) curses.init_pair(9, curses.COLOR_MAGENTA, 0) #Disable cursor (bad idea) #curses.curs_set(0) curses.noecho() curses.cbreak() stdscr.keypad(1) c.build(stdscr, line) if c.socket is None: c.connect() try: c.process() except select.error: line = c.edit.line curses.endwin() continue break except Exception, e: curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() print e sys.exit() curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin()