import pygtk import gtk import re import socket import select import gobject channels = [] ''' simple gui driven irc client .. use for any purpose ;) ''' ''' written by kestaz''' global s global nick def destroy(widget, data=None): global s s.send("QUIT\n") s.close() gtk.main_quit() def paspaustas_enter(widget, notebook, textview): global s global channels global nick txt = widget.get_text() widget.set_text("") m = re.search("/join\s\#(.+)", txt) if m != None: s.send("JOIN #"+ m.group(1) + "\n") sukurti_tab(notebook, "#" + m.group(1)) else: m = re.search("(.+)", txt) for k in channels: if k[2] == widget: textbuffer = textview.get_buffer() eil = "<" + nick + "> " + str(txt) + '\n' textbuffer.insert(textbuffer.get_end_iter(), eil) s.send("PRIVMSG " + k[0] + " :" + str(txt) + "\n") ; break return True def sukurti_langa(): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_title("irk - just another UNIX irc client!") window.set_default_size(800, 400) return window def sukurti_tab(notebook, name): table = gtk.Table(20,20, True) scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) scrolled_window.show() box = gtk.VBox(True, 0) box.pack_start(scrolled_window, True, True, 0 ) scrolled_textview = gtk.ScrolledWindow() scrolled_textview.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled_textview.show() txtview = gtk.TextView() txtview.set_editable(False) scrolled_window.add_with_viewport(txtview) txtview.set_wrap_mode(gtk.WRAP_WORD) entry = gtk.Entry() entry.connect("activate", paspaustas_enter, notebook, txtview) label = gtk.Label(name) model = gtk.ListStore(gobject.TYPE_STRING) """ iter = model.append() model.set(iter,0, "") """ view = gtk.TreeView(model) scrolled_textview.add_with_viewport(view) render = gtk.CellRendererText() view.insert_column_with_attributes(-1, "Users", render, text=0) view.show() table.attach(box,0, 17, 0,18 ) table.attach(entry, 0,17, 18,20) table.attach(scrolled_textview, 17,20, 0, 20) txtview.show() box.show() entry.show() table.show() label.show() notebook.append_page(table, label) channels.append([name, txtview, entry, view, []]) def jungimas(e, k): global channels global nick line = e.recv(1024) if len(line) > 0: eilutes = line.split("\n") for k in eilutes: m = re.match(":(.+) \d+ (.+) = #(.+) :(.+)", k) if m != None: for kanalai in channels: if kanalai[0] == '#' + m.group(3): saras = m.group(4).split(' ') for v in saras: if v != '\r': kanalai[4].append(v) saras = kanalai[4] model = gtk.ListStore(gobject.TYPE_STRING) for k in saras: if k != nick: iter = model.append() model.set(iter,0, k) kanalai[3].set_model(model) else: m = re.match(":(.+) \d+ (.+) #(.+) :(.+)", k) if m != None: for kanalai in channels: if kanalai[0] == '#' + m.group(3): textbuffer = kanalai[1].get_buffer() eil = m.group(4) textbuffer.insert(textbuffer.get_end_iter(), eil) m = re.match(":(.+)!(.+)@(.+) PRIVMSG #(.+) :(.+)", k) if m != None: for kanalai in channels: if kanalai[0] == '#' + m.group(4): textbuffer = kanalai[1].get_buffer() eil = "<"+m.group(1)+"> " + m.group(5) textbuffer.insert(textbuffer.get_end_iter(), eil) m = re.match("PING :(.+)", k) if m != None: s.send("PONG :" + m.group(1)) m= re.match(":(.+)!(.+)@(.+) JOIN :#(.+)", k) if m != None: for kanalai in channels: if kanalai[0] == '#' + m.group(4)[0:-1]: saras = kanalai[4] if nick != m.group(1): saras.append(m.group(1)) model = gtk.ListStore(gobject.TYPE_STRING) for k in saras: if k != nick: if k != "": iter = model.append() model.set(iter,0,k) kanalai[3].set_model(model) textbuffer = kanalai[1].get_buffer() eil = m.group(1) + " has joined to " + m.group(4) + '\n' textbuffer.insert(textbuffer.get_end_iter(), eil) textbuffer = channels[0][1].get_buffer() textbuffer.insert(textbuffer.get_end_iter(), line) return True def jungtis_prie_serverio(name, port, vardas): global channels global s s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((name, port)) s.send('NICK ' + vardas + '\n') s.send('USER ' + 'unixkid' + ' ' + name+ ' blah :' + 'kestaz' + '\n') gobject.io_add_watch(s, gobject.IO_IN, jungimas) nick = "kestaz`120" window = sukurti_langa() notebook = gtk.Notebook() window.add(notebook) sukurti_tab(notebook, "Status") notebook.show() window.show() window.connect("destroy", destroy) jungtis_prie_serverio("irc.le.lt", 6667, nick) gtk.main()