def __init__(self): self.kps = KappaStats(self) self.refresh_task = None self.builder = Gtk.Builder() self.builder.add_from_file("pyirc_interface.glade") self.nick = "" #windows self.window = self.builder.get_object("window1") self.connection_dialog = self.builder.get_object("connection_dialog") self.join_channel_dialog = self.builder.get_object("join_channel_dialog") #elements self.channels_notebook = self.builder.get_object("channels_notebook") self.textview = self.builder.get_object("textview1") self.text_scroll_window = self.builder.get_object("text_scroll_window") self.entry = self.builder.get_object("entry1") self.connect_btn = self.builder.get_object("connect_btn") self.join_channel_btn = self.builder.get_object("join_channel_btn") self.disconnect_btn = self.builder.get_object("disconnect_btn") self.exit_btn = self.builder.get_object("exit_btn") self.cd_save_btn = self.builder.get_object("cd_save_btn") self.cd_connect_btn = self.builder.get_object("cd_connect_btn") self.cd_cancel_btn = self.builder.get_object("cd_cancel_btn") self.cj_join_btn = self.builder.get_object("cj_join_btn") self.cj_cancel_btn = self.builder.get_object("cj_cancel_btn") self.send_btn = self.builder.get_object("send_btn") self.user_list = self.builder.get_object("user_list") self.channel_info_textview = self.builder.get_object("channel_info_textview") self.channel_info_textview.get_buffer().create_tag("b", weight=Pango.Weight.BOLD) self.refresh_channel_info_btn = self.builder.get_object("refresh_channel_info_btn") #signals self.window.connect("delete-event", Gtk.main_quit) self.channels_notebook.connect_after("switch-page", self.on_switch_channel) self.connect_btn.connect("activate", self.on_connect_btn_clicked) self.join_channel_btn.connect("activate", self.on_join_channel_btn_clicked) self.disconnect_btn.connect("activate", self.on_disconnect_btn_clicked) self.exit_btn.connect("activate", self.on_exit_btn_clicked) self.send_btn.connect("clicked", self.on_send_btn_clicked) self.cd_save_btn.connect("clicked", self.on_cd_save_btn_clicked) self.cd_connect_btn.connect("clicked", self.on_cd_connect_btn_clicked) self.cd_cancel_btn.connect("clicked", self.on_cd_cancel_btn_clicked) self.cj_join_btn.connect("clicked", self.on_cj_join_btn_clicked) self.cj_cancel_btn.connect("clicked", self.on_cj_cancel_btn_clicked) self.entry.connect("key-press-event", self.on_entry_key_pressed_enter) self.refresh_channel_info_btn.connect("clicked", self.on_refresh_channel_info_btn_clicked) #Channels self.channels = {} #create irc connection object self.irc = PyIRC() self.irc_task = None # show main window self.load_saved_con_info() self.window.show_all() self.parse_user_list_cmd_re = re.compile("^(?P<name>\S+) = (?P<channel>\S+)$")
class PyIRC_Application: def __init__(self): self.kps = KappaStats(self) self.refresh_task = None self.builder = Gtk.Builder() self.builder.add_from_file("pyirc_interface.glade") self.nick = "" #windows self.window = self.builder.get_object("window1") self.connection_dialog = self.builder.get_object("connection_dialog") self.join_channel_dialog = self.builder.get_object("join_channel_dialog") #elements self.channels_notebook = self.builder.get_object("channels_notebook") self.textview = self.builder.get_object("textview1") self.text_scroll_window = self.builder.get_object("text_scroll_window") self.entry = self.builder.get_object("entry1") self.connect_btn = self.builder.get_object("connect_btn") self.join_channel_btn = self.builder.get_object("join_channel_btn") self.disconnect_btn = self.builder.get_object("disconnect_btn") self.exit_btn = self.builder.get_object("exit_btn") self.cd_save_btn = self.builder.get_object("cd_save_btn") self.cd_connect_btn = self.builder.get_object("cd_connect_btn") self.cd_cancel_btn = self.builder.get_object("cd_cancel_btn") self.cj_join_btn = self.builder.get_object("cj_join_btn") self.cj_cancel_btn = self.builder.get_object("cj_cancel_btn") self.send_btn = self.builder.get_object("send_btn") self.user_list = self.builder.get_object("user_list") self.channel_info_textview = self.builder.get_object("channel_info_textview") self.channel_info_textview.get_buffer().create_tag("b", weight=Pango.Weight.BOLD) self.refresh_channel_info_btn = self.builder.get_object("refresh_channel_info_btn") #signals self.window.connect("delete-event", Gtk.main_quit) self.channels_notebook.connect_after("switch-page", self.on_switch_channel) self.connect_btn.connect("activate", self.on_connect_btn_clicked) self.join_channel_btn.connect("activate", self.on_join_channel_btn_clicked) self.disconnect_btn.connect("activate", self.on_disconnect_btn_clicked) self.exit_btn.connect("activate", self.on_exit_btn_clicked) self.send_btn.connect("clicked", self.on_send_btn_clicked) self.cd_save_btn.connect("clicked", self.on_cd_save_btn_clicked) self.cd_connect_btn.connect("clicked", self.on_cd_connect_btn_clicked) self.cd_cancel_btn.connect("clicked", self.on_cd_cancel_btn_clicked) self.cj_join_btn.connect("clicked", self.on_cj_join_btn_clicked) self.cj_cancel_btn.connect("clicked", self.on_cj_cancel_btn_clicked) self.entry.connect("key-press-event", self.on_entry_key_pressed_enter) self.refresh_channel_info_btn.connect("clicked", self.on_refresh_channel_info_btn_clicked) #Channels self.channels = {} #create irc connection object self.irc = PyIRC() self.irc_task = None # show main window self.load_saved_con_info() self.window.show_all() self.parse_user_list_cmd_re = re.compile("^(?P<name>\S+) = (?P<channel>\S+)$") def get_active_channel(self): page = self.channels_notebook.get_nth_page(self.channels_notebook.get_current_page()) if page == -1: return None else: active_channel = self.channels_notebook.get_tab_label_text(page).strip() if active_channel in self.channels: return self.channels[active_channel] else: return None def on_delete_event(self, widget, event, data =None): if self.irc.connected: self.irc_task.stop() self.irc.disconect() Gtk.main_quit() def on_msg(self, groups): #print(msg) output = "" if (groups.group('command') is not None) and (groups.group('params') is not None): if groups.group('command') == "PRIVMSG": nick = groups.group('prefix').partition('!')[0] channel = groups.group('params') if(self.channels_notebook.get_current_page()!=-1): page = self.channels_notebook.get_nth_page(self.channels_notebook.get_current_page()) active_channel = self.channels_notebook.get_tab_label_text(page).strip() if channel == active_channel: self.textview.scroll_to_iter(self.textview.get_buffer().get_end_iter(),0.0,False,0,0) if channel in self.channels: ch = self.channels[channel] ch.echo_no_newline(nick,ch.get_bold_tag()) ch.echo(": " + groups.group('trail')) self.kps.on_message(nick,channel,groups.group('trail')) elif groups.group('command') == "353": match = self.parse_user_list_cmd_re.match(groups.group('params')) ch_name = match.group('channel') ch = self.channels[ch_name] users = groups.group('trail').split() for usr in users: ch.add_user([usr]) elif groups.group('command') == "JOIN": nick = groups.group('prefix').partition('!')[0] ch_name = groups.group('params').strip() ch = self.channels[ch_name] ch.add_user([nick]) elif groups.group('command') == "PART": nick = groups.group('prefix').partition('!')[0] ch_name = groups.group('params').strip() ch = self.channels[ch_name] ch.remove_user([nick]) return False; def on_switch_channel(self, widget, page, page_number, data = None): name = self.channels_notebook.get_tab_label_text(page).strip() if name in self.channels: self.textview.set_buffer(self.channels[name].chat_log) self.user_list.set_model(self.channels[name].users) self.start_refresh() def on_connect_btn_clicked(self, widget): if self.irc.is_connected(): parent = None md = Gtk.MessageDialog(parent, 0, Gtk.MessageType.WARNING,Gtk.ButtonsType.CLOSE, "Can't connect to more than one server.\nPlease first disconnect.") md.run() md.destroy() return self.connection_dialog.show_all(); def on_disconnect_btn_clicked(self, widget): if self.irc.connected: self.channels = {} while self.channels_notebook.get_current_page() != -1: self.channels_notebook.remove_page(self.channels_notebook.get_current_page()) self.channels_notebook.show_all() self.irc.disconnect() self.textview.set_buffer(Gtk.TextBuffer()) self.user_list.set_model(Gtk.ListStore(str)) def on_exit_btn_clicked(self, widget): if self.irc.connected: self.channels = {} while self.channels_notebook.get_current_page() != -1: self.channels_notebook.remove_page(self.channels_notebook.get_current_page()) self.channels_notebook.show_all() self.irc.disconnect() self.textview.set_buffer(Gtk.TextBuffer()) self.user_list.set_model(Gtk.ListStore(str)) def on_join_channel_btn_clicked(self, widget): if self.irc.is_connected(): self.join_channel_dialog.show_all(); else: parent = None md = Gtk.MessageDialog(parent, 0, Gtk.MessageType.WARNING,Gtk.ButtonsType.CLOSE, "Can't join a channel while not connected to server.\nPlease connect to a server first.") md.run() md.destroy() return def evaluate_entry_box(self): if self.irc.connected: text = self.entry.get_text() page_num = self.channels_notebook.get_current_page() if page_num == -1 : return page = self.channels_notebook.get_nth_page(page_num) channel = self.channels_notebook.get_tab_label_text(page).strip() if channel in self.channels: self.channels[channel].echo("> "+self.nick+": "+text) self.irc.send_msg("PRIVMSG " + channel + " :" + text) self.entry.set_text("") def on_send_btn_clicked(self, widget): self.evaluate_entry_box() def on_entry_key_pressed_enter(self, widget, ev, data=None): if ev.keyval == Gdk.KEY_Return: self.evaluate_entry_box() def on_cd_save_btn_clicked(self, widget): info = {} info['server']=self.builder.get_object("cd_server_entry").get_text() info['nick']=self.builder.get_object("cd_nickname_entry").get_text() info['password']=self.builder.get_object("cd_password_entry").get_text() with open('con_info.dat', 'wb') as handle: pickle.dump(info, handle) def load_saved_con_info(self): with open('con_info.dat', 'rb') as handle: info = pickle.loads(handle.read()) self.builder.get_object("cd_server_entry").set_text(info['server']) self.builder.get_object("cd_nickname_entry").set_text(info['nick']) self.builder.get_object("cd_password_entry").set_text(info['password']) def on_cd_connect_btn_clicked(self, widget): if self.irc.connected: self.irc.disconnect(); server = self.builder.get_object("cd_server_entry").get_text() nick = self.builder.get_object("cd_nickname_entry").get_text() password = self.builder.get_object("cd_password_entry").get_text() #TCP_ADDR = 'irc.twitch.tv' TCP_PORT = 6667 self.irc.connect(server,TCP_PORT) self.irc_task = Task(self.irc.parse_messages,self.on_msg) self.irc_task.start() self.irc.send_msg("PASS " + password) self.irc.send_msg("NICK " + nick) self.nick = nick self.connection_dialog.hide() def on_cd_cancel_btn_clicked(self, widget): self.connection_dialog.hide() def on_cj_join_btn_clicked(self, widget): channel_name = self.builder.get_object("cj_channel_name_entry").get_text().strip() self.irc.send_msg("JOIN " + channel_name) self.channels[channel_name]=Channel(channel_name) self.join_channel_dialog.hide(); self.channels_notebook.insert_page(Gtk.Frame(),Gtk.Label(channel_name),0) self.channels_notebook.show_all() def on_cj_cancel_btn_clicked(self, widget): self.join_channel_dialog.hide(); def start_refresh(self): tb = self.channel_info_textview.get_buffer() tb.delete(tb.get_start_iter(),tb.get_end_iter()) if self.get_active_channel() is not None and self.refresh_task is None: self.refresh_task = Task(pyirc_tools.PyIRC_Twitch_Channel_Status_Parser,self.get_active_channel().name,self.on_refresh_channel_info) self.refresh_task.start() def on_refresh_channel_info_btn_clicked(self, widget): self.start_refresh() print("refreshing") def on_refresh_channel_info(self, channel, data): if self.refresh_task is not None : self.refresh_task.stop() self.refresh_task = None tb = self.channel_info_textview.get_buffer() tb.insert_with_tags_by_name(tb.get_end_iter(), "Channel : ", "b") tb.insert(tb.get_end_iter(), channel + "\n") tb.insert_with_tags_by_name(tb.get_end_iter(), "Status : ", "b") tb.insert(tb.get_end_iter(), ("Offline" if data["stream"]==None else "Online") + "\n") if data["stream"]!=None : tb.insert_with_tags_by_name(tb.get_end_iter(), "Game : ", "b") tb.insert(tb.get_end_iter(), data["stream"]["game"] + "\n") tb.insert_with_tags_by_name(tb.get_end_iter(), "Title : ", "b") tb.insert(tb.get_end_iter(), data["stream"]["channel"]["status"] + "\n") else: print("Refresh task is None.") print("done refreshing")