#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2009 Pâris Quentin # Copyright (C) 2007-2010 PlayOnLinux Team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os, sys, string, shutil import wx, time #from subprocess import Popen,PIPE import wine_versions import lib.playonlinux as playonlinux import lib.wine as wine import lib.Variables as Variables import lib.lng as lng import lib.irc as irc class Onglets(wx.Notebook): # Classe dérivée du wx.Notebook def __init__(self, parent): self.notebook = wx.Notebook.__init__(self, parent, -1) def getSettings(self): # Faudra revoir ça dans une future version irc_settings = {} if(os.environ["POL_OS"] == "Linux"): irc_settings['NICKNAME'] = os.environ["USER"]+"-pol" else: irc_settings['NICKNAME'] = os.environ["USER"]+"-pom" irc_settings['AUTOCONNECT'] = "0" irc_settings['ALERT'] = "0" irc_settings["PLAYSOUND"] = "1" if(os.path.exists(Variables.playonlinux_rep+"/configurations/options/irc")): ircfile = open(Variables.playonlinux_rep+"/configurations/options/irc","r").readlines() self.i = 0 while(self.i < len(ircfile)): line_parsed = string.split(ircfile[self.i].replace("\n","").replace("\r",""),"=") irc_settings[line_parsed[0]] = line_parsed[1] self.i += 1 return irc_settings def selectChanByText(self, text): self.item = self.root_window self.ij = 0 self.texte = None while(self.texte != text): if(self.ij >= len(irc.chans)): return self.window.GetLastChild(self.root_window) self.item = self.window.GetNextVisible(self.item) self.texte = self.window.GetItemText(self.item) self.ij += 1 return self.item def OpenWindow(self): #if(nom.lower() not in irc.chans and not "@" in nom and nom != "freenode-connect"): #self.old_selection = self.window.GetItemText(self.window.GetSelection()) self.window.DeleteAllItems() self.root_window = self.window.AddRoot("") self.i = 0 while(self.i < len(irc.chans)): nom = irc.chans[self.i].lower() if("." not in nom and nom != "freenode-connect"): if("#" in nom): self.window.AppendItem(self.root_window, nom, 0) else: if(nom.lower() == "nickserv" or nom.lower() == "chanserv" or nom.lower() == "botserv"): self.window.AppendItem(self.root_window, nom, 2) else: if(nom.lower() == "playonlinux"): self.window.AppendItem(self.root_window, nom, 3) else: self.window.AppendItem(self.root_window, nom, 1) #if(self.i == 0): #self.window.SelectItem(self.window.GetLastChild(self.root_window)) self.i += 1 #item = self.selectChanByText(self.old_selection) #self.window.SelectItem(item) #irc.open_window.append(nom.lower()) def selectWindow(self, name): item = self.selectChanByText(name) self.window.SelectItem(item) def AjouteIRC(self, nom): self.panel = wx.Panel(self, -1) self.panels_button = wx.Panel(self.panel, -1) self.panels_main = wx.Panel(self.panel, -1) self.panels_connexion = wx.Panel(self.panel, -1) #self.content = wx.TextCtrl(self.panel, 107, pos=(0,20), size=(500,300), style = wx.TE_MULTILINE | wx.TE_RICH2 | wx.CB_READONLY | wx.RAISED_BORDER) self.content = wx.html.HtmlWindow(self.panels_main, -1, style=wx.RAISED_BORDER) self.buddy = wx.TreeCtrl(self.panels_main, 126, style=wx.TR_HIDE_ROOT|wx.TR_FULL_ROW_HIGHLIGHT|wx.RAISED_BORDER) self.buddy.SetSpacing(0); self.window = wx.TreeCtrl(self.panels_main, 127, style=wx.TR_HIDE_ROOT|wx.TR_FULL_ROW_HIGHLIGHT|wx.RAISED_BORDER) #self.root_window = self.window.AddRoot("") self.window.SetSpacing(0); self.buddy_images = wx.ImageList(16, 16) self.buddy_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/install/star.png")); self.buddy_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/install/h-star.png")); self.buddy_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/playonlinux16.png")); self.buddy_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/install/spacer16.png")); self.buddy_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/install/star.png")); self.buddy.SetImageList(self.buddy_images) self.window_images = wx.ImageList(16,16) self.window_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/onglet/internet-group-chat.png")); self.window_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/onglet/system-users.png")); self.window_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/onglet/applications-system.png")); self.window_images.Add(wx.Bitmap(Variables.playonlinux_env+"/etc/playonlinux16.png")); self.window.SetImageList(self.window_images) self.buddy.SetSpacing(0); self.field = wx.TextCtrl(self.panels_button, 121, style = wx.TE_MULTILINE) self.button = wx.Button(self.panels_button, 122, _("Send")) self.connect = wx.Button(self.panels_connexion, 123, _("Connect"), pos=(0,0), size=(100,28)) self.disconnect = wx.Button(self.panels_connexion, 124, _("Disconnect"), pos=(100,0), size=(100,28)) #self.close = wx.Button(self.panels_connexion, 128, _("Close"), pos=(600,0), size=(90,25)) self.close = wx.BitmapButton(self.panels_connexion, 128, wx.Bitmap(Variables.playonlinux_env+"/resources/images/menu/wineserver.png"), pos=(520,0)) self.settings = self.getSettings() self.nickname = wx.TextCtrl(self.panels_connexion, 125, self.settings["NICKNAME"], size=(300,25), pos=(210,2)) #self.channel_choices = ["#playonlinux-fr","#playonlinux-en","#playonlinux-it","#playonlinux-ru","#playonlinux-pl","#playonlinux-hu","#playonlinux-es"] #self.channel_choices.sort() #self.channel = wx.ComboBox(self.panels_connexion, 130, _("Join a channel"), size=(190,28), pos=(510,0), choices=self.channel_choices) # self.close.Enable(False) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizerInputs = wx.BoxSizer(wx.HORIZONTAL) self.sizerMain = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(self.panels_connexion, 3, wx.EXPAND|wx.ALL, 2) self.sizer.Add(self.panels_main, 36, wx.EXPAND|wx.ALL, 2) self.sizer.Add(self.panels_button, 4, wx.EXPAND|wx.ALL, 2) self.sizerInputs.Add(self.field, 14, wx.EXPAND|wx.ALL, 2) self.sizerInputs.Add(self.button, 4, wx.EXPAND|wx.ALL, 2) self.sizerMain.Add(self.window, 4, wx.EXPAND|wx.ALL, 2) self.sizerMain.Add(self.content, 10, wx.EXPAND|wx.ALL, 2) self.sizerMain.Add(self.buddy, 4, wx.EXPAND|wx.ALL, 2) self.panel.SetSizer(self.sizer) self.panels_button.SetSizer(self.sizerInputs) self.panels_main.SetSizer(self.sizerMain) self.panel.SetAutoLayout(True) self.AddPage(self.panel, nom) self.field.Bind(wx.EVT_KEY_UP, self.EventKey) self.nickname.Bind(wx.EVT_KEY_UP, self.NicknameKey) #self.channel.Bind(wx.EVT_KEY_UP, self.EventChannel) wx.EVT_COMBOBOX(self, 130, self.JoinChan) wx.EVT_BUTTON(self, 122, self.EventButton) wx.EVT_BUTTON(self, 123, self.EventStart) wx.EVT_BUTTON(self, 124, self.EventStop) wx.EVT_BUTTON(self, 128, self.EventClose) wx.EVT_TREE_ITEM_ACTIVATED(self, 126, self.AddNick) #wx.EVT_TREE_ITEM_ACTIVATED(self, 127, self.filtrer) #self.disconnect.Enable(False) #self.EventStart(self) def AddNick(self, event): self.buddy_txt = self.buddy.GetItemText(self.buddy.GetSelection()).encode("utf-8") irc.join(self.buddy_txt) #if(self.buddy_txt not in irc.chans): #self.field.SetValue("/msg "+self.buddy_txt+" ") #self.OpenWindow(self.buddy_txt) def SendMessage(self): self.chars = self.field.GetValue().replace('\n','').encode("utf-8") if(self.chars): self.field.Clear() irc.SendMSG(self.chars) else: self.field.Clear() def EventClose(self, event): #index = irc.get_index(self.window.GetItemText(self.window.GetSelection()).lower()): #print index #del irc.messages[index] #del irc.names[index] #del irc.endnames[index] #del irc.chans[index] irc.leave_chan(self.window.GetItemText(self.window.GetSelection()).lower()) self.window.Delete(self.window.GetSelection()) #self.close.Enable(False) def EventStart(self, event): irc.Nick = self.nickname.GetValue().encode("utf-8") irc.Connexion() def EventChannel(self, event): if(event.GetKeyCode() == wx.WXK_RETURN): self.JoinChan(self) event.Skip() def JoinChan(self, event): my_chan = self.channel.GetValue() if(my_chan[0] == "#"): if(irc.ircconnected == True): irc.join(my_chan) self.channel.SetValue(_("Join a channel")) def EventStop(self, event): irc.stop() def EventButton(self, event): self.SendMessage() def EventKey(self, event): if(event.GetKeyCode() == wx.WXK_RETURN): self.SendMessage() event.Skip() def NicknameKey(self, event): if(event.GetKeyCode() == wx.WXK_RETURN): if(irc.ircconnected == True): irc.ChangeNick(self.nickname.GetValue().encode("utf-8")) else: irc.Connexion() event.Skip() class IrcClient(wx.Frame): def __init__(self,parent,title=""): wx.Frame.__init__(self, parent, -1, title, size = (700, 500)) self.SetIcon(wx.Icon(Variables.playonlinux_env+"/etc/playonlinux.png", wx.BITMAP_TYPE_ANY)) self.timer = wx.Timer(self, 1) self.onglets = Onglets(self) #self.onglets.hide() self.onglets.AjouteIRC(_("Messenger")) self.oldreload = "" self.oldimg = "" self.names = ["~"] self.messages = ["~"] self.chans = ["~"] self.already_connected = False self.settings = irc.getSettings() self.resized = False #self.settings["AUTOCONNECT"] = "TRUE" #Timer, regarde toute les secondes si il faut actualiser la liste self.Bind(wx.EVT_TIMER, self.AutoReload, self.timer) wx.EVT_CLOSE(self, self.CloseIRC) self.timer.Start(200) def CloseIRC(self, event): if(wx.YES == wx.MessageBox(_('If you close this window, you cannot read further replies. Are you sure that you want to close it?').format(os.environ["APPLICATION_TITLE"]).decode("utf-8"), style=wx.YES_NO | wx.ICON_QUESTION)): self.onglets.EventStop(self) self.Destroy() def change_irc_window(self, event): #self.irc_user_list(self) self.html_reload(self) #print self.onglets.window.GetItemText(self.onglets.window.GetSelection()) def irc_key(self, item): if(item[0] == "~"): return ("A") else: if(item[0] == "@" or item[0] == "&"): return ("B") else : if(item[0] == "%"): return ("C") else: if(item[0] == "+"): return ("D") else: return string.lower(item[0]) def html_reload(self, event): #print("Refresh html") self.window_txt = self.onglets.window.GetItemText(self.onglets.window.GetSelection()).encode("utf-8") irc.selected_window = self.window_txt self.chat_content = "" # On regarde quelle liste on va prendre id_liste = irc.get_index(self.window_txt) # On ajoute tout self.i = 0 if(len(irc.messages[id_liste]) >= 300): del irc.messages[id_liste][0] while(self.i < len(irc.messages[id_liste])): if(self.i != 0): self.chat_content += "\n
" self.chat_content += irc.messages[id_liste][self.i] self.i += 1 self.onglets.content.SetPage("

"+self.chat_content+"

") self.onglets.content.Scroll(0,len(irc.messages[id_liste])*2) def html_reload_status(self, event): self.chat_content = "" # On regarde quelle liste on va prendre self.i = 0 if(len(irc.status_messages) >= 300): del irc.status_messages[0] while(self.i < len(irc.status_messages)): self.chat_content += irc.status_messages[self.i]+"
\n" self.i += 1 self.onglets.content.SetPage("

"+self.chat_content+"

") self.onglets.content.Scroll(0,len(irc.status_messages)*2) def irc_user_list(self, event): self.window_txt = self.onglets.window.GetItemText(self.onglets.window.GetSelection()).encode("utf-8").lower() irc.selected_window = self.window_txt # On casse tout self.onglets.buddy.DeleteAllItems() self.buddy_root = self.onglets.buddy.AddRoot("") # On regarde quelle liste on va prendre id_liste = irc.get_index(self.window_txt) # On ajoute tout self.user_i = 0 while(self.user_i < len(irc.names[id_liste])): num = 3 irc.names[id_liste].sort(key=self.irc_key) if("@" in irc.names[id_liste][self.user_i] or "&" in irc.names[id_liste][self.user_i]): num = 0 if("~" in irc.names[id_liste][self.user_i]): num = 4 if("%" in irc.names[id_liste][self.user_i]): num = 1 if("+" in irc.names[id_liste][self.user_i]): num = 2 self.onglets.buddy.AppendItem(self.buddy_root, irc.names[id_liste][self.user_i].replace("&","").replace("~","").replace("%","").replace("+","").replace("@",""), num) html_hex = irc.GenColor(irc.names[id_liste][self.user_i].replace("&","").replace("~","").replace("%","").replace("+","").replace("@","")) self.couleur = [pow(int(html_hex[2],16),2),pow(int(html_hex[3],16),2),pow(int(html_hex[4],16),2)] self.onglets.buddy.SetItemTextColour(self.onglets.buddy.GetLastChild(self.buddy_root), wx.Colour(int(self.couleur[0]),int(self.couleur[1]),int(self.couleur[2]))) self.user_i += 1 #wx.Yield() def AutoReload(self, event): if(self.resized == False): # wx 2.9 resizing probem self.SetSize((800,500)) self.resized = True self.new_string = irc.string_to_write if(irc.ircconnected == True): if(self.chans != irc.chans): self.onglets.OpenWindow() self.chans = irc.chans[:] #print "Refresh" #else : #print str(self.chans)+" --- "+str(irc.chans) self.window_txt = self.onglets.window.GetItemText(self.onglets.window.GetSelection()).encode("utf-8").lower() if(len(self.window_txt) > 0): id_liste = irc.get_index(self.window_txt) if(self.window_txt[0] == "#"): #print self.names if(irc.names[id_liste] != self.names): self.irc_user_list(self) self.names = irc.names[id_liste][:] #if(len(irc.messages) > id_liste+1): if(irc.messages[id_liste] != self.messages): self.html_reload(self) self.messages = irc.messages[id_liste][:] if(irc.select_window != ""): self.onglets.selectWindow(irc.select_window) irc.select_window = "" if(self.onglets.window.GetItemText(self.onglets.window.GetSelection()) != irc.selected_window): irc.selected_window = self.onglets.window.GetItemText(self.onglets.window.GetSelection()) if(irc.selected_window == "#playonlinux"): self.onglets.close.Enable(False) else: self.onglets.close.Enable(True) self.onglets.connect.Enable(False) self.onglets.disconnect.Enable(True) if(len(self.chans) == 0): if(irc.status_messages != self.messages): self.html_reload_status(self) self.messages = irc.status_messages[:] else: if(irc.status_messages != self.messages): self.html_reload_status(self) self.messages = irc.status_messages[:] self.onglets.buddy.DeleteAllItems() self.onglets.window.DeleteAllItems() self.onglets.connect.Enable(True) self.onglets.disconnect.Enable(False) if(self.settings["AUTOCONNECT"] == "1"): if(self.already_connected == False): irc.Nick = self.onglets.nickname.GetValue().encode("utf-8") irc.connect() self.already_connected = True; irc = irc.IRCClient()