quick_frontend, wix, primitivus: informations in chat window
- user joined/left information - messages starting with /me are managed
This commit is contained in:
parent
03e9f23b01
commit
36d51e6acf
3 changed files with 72 additions and 17 deletions
|
|
@ -32,11 +32,11 @@ from files_management import FileDialog
|
|||
class ChatText(urwid.FlowWidget):
|
||||
"""Manage the printing of chat message"""
|
||||
|
||||
def __init__(self, parent, timestamp, my_jid, from_jid, message, align='left'):
|
||||
def __init__(self, parent, timestamp, nick, my_mess, message, align='left'):
|
||||
self.parent = parent
|
||||
self.timestamp = time.localtime(timestamp)
|
||||
self.my_jid = my_jid
|
||||
self.from_jid = from_jid
|
||||
self.nick = nick
|
||||
self.my_mess = my_mess
|
||||
self.message = unicode(message)
|
||||
self.align = align
|
||||
|
||||
|
|
@ -60,16 +60,14 @@ class ChatText(urwid.FlowWidget):
|
|||
return 0, 0
|
||||
|
||||
def display_widget(self, size, focus):
|
||||
my_mess = (self.from_jid.resource == self.parent.nick) if self.parent.type == "group" else (self.from_jid.short == self.my_jid.short) #mymess = True if message comes from local user
|
||||
render_txt = []
|
||||
if self.parent.show_timestamp:
|
||||
time_format = "%c" if self.timestamp < self.parent.day_change else "%H:%M" #if the message was sent before today, we print the full date
|
||||
render_txt.append(('date',"[%s]" % time.strftime(time_format, self.timestamp)))
|
||||
if self.parent.show_short_nick:
|
||||
render_txt.append(('my_nick' if my_mess else 'other_nick',"**" if my_mess else "*"))
|
||||
render_txt.append(('my_nick' if self.my_mess else 'other_nick',"**" if self.my_mess else "*"))
|
||||
else:
|
||||
nick = self.from_jid.resource if self.parent.type == "group" else (self.parent.host.CM.getAttr(self.from_jid,'nick') or self.parent.host.CM.getAttr(self.from_jid,'name') or self.from_jid.node)
|
||||
render_txt.append(('my_nick' if my_mess else 'other_nick',"[%s] " % nick))
|
||||
render_txt.append(('my_nick' if self.my_mess else 'other_nick',"[%s] " % self.nick))
|
||||
render_txt.append(self.message)
|
||||
return urwid.Text(render_txt, align=self.align)
|
||||
|
||||
|
|
@ -227,8 +225,23 @@ class Chat(urwid.WidgetWrap, QuickChat):
|
|||
|
||||
def printMessage(self, from_jid, msg, profile, timestamp=""):
|
||||
assert isinstance(from_jid, JID)
|
||||
try:
|
||||
jid,nick,mymess = QuickChat.printMessage(self, from_jid, msg, profile, timestamp)
|
||||
except TypeError:
|
||||
return
|
||||
my_jid = self.host.profiles[profile]['whoami']
|
||||
self.content.append(ChatText(self, timestamp or None, my_jid, from_jid, msg))
|
||||
self.content.append(ChatText(self, timestamp or None, nick, mymess, msg))
|
||||
self.text_list.set_focus(len(self.content)-1)
|
||||
self.host.redraw()
|
||||
|
||||
def printInfo(self, msg, type='normal'):
|
||||
"""Print general info
|
||||
@param msg: message to print
|
||||
@type: one of:
|
||||
normal: general info like "toto has joined the room"
|
||||
me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist"
|
||||
"""
|
||||
self.content.append(custom_widgets.ClickableText(msg))
|
||||
self.text_list.set_focus(len(self.content)-1)
|
||||
self.host.redraw()
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,10 @@ class QuickChat():
|
|||
if self.type != "group":
|
||||
error (_("[INTERNAL] trying to replace user for a non group chat window"))
|
||||
raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here
|
||||
len_before = len(self.occupants)
|
||||
self.occupants.add(nick)
|
||||
if len_before != len(self.occupants):
|
||||
self.printInfo("=> %s has joined the room" % nick)
|
||||
|
||||
def setUserNick(self, nick):
|
||||
"""Set the nick of the user, usefull for e.g. change the color of the user"""
|
||||
|
|
@ -69,6 +72,7 @@ class QuickChat():
|
|||
error (_("[INTERNAL] trying to remove user for a non group chat window"))
|
||||
raise Exception("INTERNAL ERROR") #TODO: raise proper Exception here
|
||||
self.occupants.remove(nick)
|
||||
self.printInfo("=> %s has left the room" % nick)
|
||||
|
||||
def setSubject(self, subject):
|
||||
"""Set title for a group chat"""
|
||||
|
|
@ -88,9 +92,29 @@ class QuickChat():
|
|||
if keep_last: ##FIXME hack for sortilege
|
||||
self.last_history = stamps[-1] if stamps else None
|
||||
|
||||
def _get_nick(self, jid):
|
||||
"""Return nick of this jid when possible"""
|
||||
return jid.resource if self.type == "group" else (self.host.CM.getAttr(jid,'nick') or self.host.CM.getAttr(jid,'name') or jid.node)
|
||||
|
||||
def printMessage(self, from_jid, msg, profile, timestamp):
|
||||
"""Print message in chat window. Must be implemented by child class"""
|
||||
jid=JID(from_jid)
|
||||
nick = self._get_nick(jid)
|
||||
mymess = (jid.resource == self.nick) if self.type == "group" else (jid.short == self.host.profiles[profile]['whoami'].short) #mymess = True if message comes from local user
|
||||
if msg.startswith('/me '):
|
||||
self.printInfo('* %s %s' % (nick, msg[4:]),type='me')
|
||||
return
|
||||
return jid, nick, mymess
|
||||
|
||||
def printInfo(self, msg, type='normal'):
|
||||
"""Print general info
|
||||
@param msg: message to print
|
||||
@type: one of:
|
||||
normal: general info like "toto has joined the room"
|
||||
me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist"
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
def startGame(self, game_type, referee, players):
|
||||
"""Configure the chat window to start a game"""
|
||||
|
|
|
|||
|
|
@ -198,14 +198,22 @@ class Chat(wx.Frame, QuickChat):
|
|||
profile_key=self.host.profile)
|
||||
self.textBox.Clear()
|
||||
|
||||
|
||||
def __blink(self):
|
||||
"""Do wizzz and buzzz to show window to user or
|
||||
at least inform him of something new"""
|
||||
#TODO: use notification system
|
||||
if not self.IsActive():
|
||||
self.RequestUserAttention()
|
||||
if not self.IsShown():
|
||||
self.Show()
|
||||
|
||||
def printMessage(self, from_jid, msg, profile, timestamp=""):
|
||||
"""Print the message with differents colors depending on where it comes from."""
|
||||
jid=JID(from_jid)
|
||||
try:
|
||||
jid,nick,mymess = QuickChat.printMessage(self, from_jid, msg, profile, timestamp)
|
||||
except TypeError:
|
||||
return
|
||||
print "printMessage, jid=",jid,"type=",self.type
|
||||
nick = jid.resource if self.type == "group" else (self.host.CM.getAttr(jid,'nick') or self.host.CM.getAttr(jid,'name') or jid.node)
|
||||
mymess = (jid.resource == self.nick) if self.type == "group" else (jid.short == self.host.profiles[profile]['whoami'].short) #mymess = True if message comes from local user
|
||||
_font_bold = wx.Font(self.font["points"], self.font["family"], wx.NORMAL, wx.BOLD)
|
||||
_font_normal = wx.Font(self.font["points"], self.font["family"], wx.NORMAL, wx.NORMAL)
|
||||
_font_italic = wx.Font(self.font["points"], self.font["family"], wx.ITALIC if mymess else wx.NORMAL, wx.NORMAL)
|
||||
|
|
@ -218,11 +226,21 @@ class Chat(wx.Frame, QuickChat):
|
|||
self.chatWindow.SetDefaultStyle(wx.TextAttr("BLACK", font=_font_italic))
|
||||
self.chatWindow.AppendText("%s\n" % msg)
|
||||
if not mymess:
|
||||
#TODO: use notification system
|
||||
if not self.IsActive():
|
||||
self.RequestUserAttention()
|
||||
if not self.IsShown():
|
||||
self.Show()
|
||||
self.__blink()
|
||||
|
||||
def printInfo(self, msg, type='normal'):
|
||||
"""Print general info
|
||||
@param msg: message to print
|
||||
@type: one of:
|
||||
normal: general info like "toto has joined the room"
|
||||
me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist"
|
||||
"""
|
||||
_font_bold = wx.Font(self.font["points"], self.font["family"], wx.NORMAL, wx.BOLD)
|
||||
_font_normal = wx.Font(self.font["points"], self.font["family"], wx.NORMAL, wx.NORMAL)
|
||||
self.chatWindow.SetDefaultStyle(wx.TextAttr("BLACK", font=_font_bold if type == 'normal' else _font_normal))
|
||||
self.chatWindow.AppendText("%s\n" % msg)
|
||||
if type=="me":
|
||||
self.__blink()
|
||||
|
||||
### events ###
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue