Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred-agent <hell.director@gmail.com>2009-09-11 05:54:26 +0400
committerred-agent <hell.director@gmail.com>2009-09-11 05:54:26 +0400
commitc38e7050f5ea4ced05d70babb018723db0ef2276 (patch)
treec1e89b30525d64c2c2bcd97521c7d2c39ed4b247
parentfaf3a1fe6faee2871c7149f8e535425deb1c78bc (diff)
Swept everything related to commands
-rw-r--r--src/chat_control.py116
-rw-r--r--src/groupchat_control.py375
2 files changed, 17 insertions, 474 deletions
diff --git a/src/chat_control.py b/src/chat_control.py
index 4d2a8806f..6bf451ff9 100644
--- a/src/chat_control.py
+++ b/src/chat_control.py
@@ -603,45 +603,24 @@ class ChatControlBase(MessageControl):
self.drag_entered_conv = True
self.conv_textview.tv.set_editable(True)
- def _process_command(self, message):
- if not message or message[0] != '/':
- return False
-
- message = message[1:]
- message_array = message.split(' ', 1)
- command = message_array.pop(0).lower()
- if message_array == ['']:
- message_array = []
-
- if command == 'clear' and not len(message_array):
- self.conv_textview.clear() # clear conversation
- self.clear(self.msg_textview) # clear message textview too
- return True
- elif message == 'compact' and not len(message_array):
- self.chat_buttons_set_visible(not self.hide_chat_buttons)
- self.clear(self.msg_textview)
- return True
- return False
-
def send_message(self, message, keyID='', type_='chat', chatstate=None,
- msg_id=None, composing_xep=None, resource=None, process_command=True,
+ msg_id=None, composing_xep=None, resource=None,
xhtml=None, callback=None, callback_args=[]):
'''Send the given message to the active tab. Doesn't return None if error
'''
if not message or message == '\n':
return None
- if not process_command or not self._process_command(message):
- MessageControl.send_message(self, message, keyID, type_=type_,
- chatstate=chatstate, msg_id=msg_id, composing_xep=composing_xep,
- resource=resource, user_nick=self.user_nick, xhtml=xhtml,
- callback=callback, callback_args=callback_args)
+ MessageControl.send_message(self, message, keyID, type_=type_,
+ chatstate=chatstate, msg_id=msg_id, composing_xep=composing_xep,
+ resource=resource, user_nick=self.user_nick, xhtml=xhtml,
+ callback=callback, callback_args=callback_args)
- # Record message history
- self.save_sent_message(message)
+ # Record message history
+ self.save_sent_message(message)
- # Be sure to send user nickname only once according to JEP-0172
- self.user_nick = None
+ # Be sure to send user nickname only once according to JEP-0172
+ self.user_nick = None
# Clear msg input
message_buffer = self.msg_textview.get_buffer()
@@ -1129,7 +1108,6 @@ class ChatControl(ChatControlBase):
'''A control for standard 1-1 chat'''
TYPE_ID = message_control.TYPE_CHAT
old_msg_kind = None # last kind of the printed message
- CHAT_CMDS = ['clear', 'compact', 'help', 'me', 'ping', 'say']
def __init__(self, parent_win, contact, acct, session, resource = None):
ChatControlBase.__init__(self, self.TYPE_ID, parent_win,
@@ -1718,83 +1696,11 @@ class ChatControl(ChatControlBase):
elif self.session and self.session.enable_encryption:
dialogs.ESessionInfoWindow(self.session)
- def _process_command(self, message):
- if message[0] != '/':
- return False
-
- # Handle common commands
- if ChatControlBase._process_command(self, message):
- return True
-
- message = message[1:]
- message_array = message.split(' ', 1)
- command = message_array.pop(0).lower()
- if message_array == ['']:
- message_array = []
-
- if command == 'me':
- if len(message_array):
- return False # /me is not really a command
- else:
- self.get_command_help(command)
- return True # do not send "/me" as message
-
- if command == 'help':
- if len(message_array):
- subcommand = message_array.pop(0)
- self.get_command_help(subcommand)
- else:
- self.get_command_help(command)
- self.clear(self.msg_textview)
- return True
- elif command == 'ping':
- if not len(message_array):
- if self.account == gajim.ZEROCONF_ACC_NAME:
- self.print_conversation(
- _('Command not supported for zeroconf account.'), 'info')
- else:
- gajim.connections[self.account].sendPing(self.contact)
- else:
- self.get_command_help(command)
- self.clear(self.msg_textview)
- return True
- return False
-
- def get_command_help(self, command):
- if command == 'help':
- self.print_conversation(_('Commands: %s') % ChatControl.CHAT_CMDS,
- 'info')
- elif command == 'clear':
- self.print_conversation(_('Usage: /%s, clears the text window.') % \
- command, 'info')
- elif command == 'compact':
- self.print_conversation(_('Usage: /%s, hide the chat buttons.') % \
- command, 'info')
- elif command == 'me':
- self.print_conversation(_('Usage: /%(command)s <action>, sends action '
- 'to the current group chat. Use third person. (e.g. /%(command)s '
- 'explodes.)'
- ) % {'command': command}, 'info')
- elif command == 'ping':
- self.print_conversation(_('Usage: /%s, sends a ping to the contact') %\
- command, 'info')
- elif command == 'say':
- self.print_conversation(_('Usage: /%s, send the message to the contact') %\
- command, 'info')
- else:
- self.print_conversation(_('No help info for /%s') % command, 'info')
-
def send_message(self, message, keyID='', chatstate=None, xhtml=None):
'''Send a message to contact'''
- if message in ('', None, '\n') or self._process_command(message):
+ if message in ('', None, '\n'):
return None
- # Do we need to process command for the message ?
- process_command = True
- if message.startswith('/say'):
- message = message[5:]
- process_command = False
-
# refresh timers
self.reset_kbd_mouse_timeout_vars()
@@ -1853,7 +1759,7 @@ class ChatControl(ChatControlBase):
ChatControlBase.send_message(self, message, keyID, type_='chat',
chatstate=chatstate_to_send, composing_xep=composing_xep,
- process_command=process_command, xhtml=xhtml, callback=_on_sent,
+ xhtml=xhtml, callback=_on_sent,
callback_args=[contact, message, encrypted, xhtml])
def check_for_possible_paused_chatstate(self, arg):
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index 754c20df9..72912953c 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -182,10 +182,6 @@ class PrivateChatControl(ChatControl):
class GroupchatControl(ChatControlBase):
TYPE_ID = message_control.TYPE_GC
- # alphanum sorted
- MUC_CMDS = ['ban', 'block', 'chat', 'query', 'clear', 'close', 'compact',
- 'help', 'invite', 'join', 'kick', 'leave', 'me', 'msg', 'nick',
- 'part', 'names', 'say', 'topic', 'unblock']
def __init__(self, parent_win, contact, acct, is_continued=False):
ChatControlBase.__init__(self, self.TYPE_ID, parent_win,
@@ -281,7 +277,6 @@ class GroupchatControl(ChatControlBase):
self.attention_list = []
self.room_creation = int(time.time()) # Use int to reduce mem usage
self.nick_hits = []
- self.cmd_hits = []
self.last_key_tabs = False
self.subject = ''
@@ -1510,262 +1505,6 @@ class GroupchatControl(ChatControlBase):
if model.iter_n_children(parent_iter) == 0:
model.remove(parent_iter)
- def _process_command(self, message):
- if message[0] != '/':
- return False
-
- # Handle common commands
- if ChatControlBase._process_command(self, message):
- return True
-
- message = message[1:]
- message_array = message.split(' ', 1)
- command = message_array.pop(0).lower()
- if message_array == ['']:
- message_array = []
-
- if command == 'me':
- return False # This is not really a command
-
- if command == 'nick':
- # example: /nick foo
- if len(message_array) and message_array[0] != self.nick:
- nick = message_array[0]
- try:
- nick = helpers.parse_resource(nick)
- except Exception:
- # Invalid Nickname
- dialogs.ErrorDialog(_('Invalid nickname'),
- _('The nickname has not allowed characters.'))
- return True
- gajim.connections[self.account].join_gc(nick, self.room_jid, None,
- change_nick=True)
- self.new_nick = nick
- self.clear(self.msg_textview)
- else:
- self.get_command_help(command)
- return True
- elif command == 'query' or command == 'chat':
- # Open a chat window to the specified nick
- # example: /query foo
- if len(message_array):
- nick0 = message_array.pop(0)
- if nick0[-1] == ' ':
- nick1 = nick0[:-1]
- else:
- nick1 = nick0
- nicks = gajim.contacts.get_nick_list(self.account, self.room_jid)
- for nick in (nick0, nick1):
- if nick in nicks:
- self.on_send_pm(nick=nick)
- self.clear(self.msg_textview)
- return True
- self.print_conversation(_('Nickname not found: %s') % \
- nick0, 'info')
- else:
- self.get_command_help(command)
- return True
- elif command == 'msg':
- # Send a message to a nick. Also opens a private message window.
- # example: /msg foo Hey, what's up?
- if len(message_array):
- message_array = message_array[0].split()
- nick = message_array.pop(0)
- room_nicks = gajim.contacts.get_nick_list(self.account,
- self.room_jid)
- if nick in room_nicks:
- privmsg = ' '.join(message_array)
- self.on_send_pm(nick=nick, msg=privmsg)
- self.clear(self.msg_textview)
- else:
- self.print_conversation(_('Nickname not found: %s') % nick,
- 'info')
- else:
- self.get_command_help(command)
- return True
- elif command == 'topic':
- # display or change the room topic
- # example: /topic : print topic
- # /topic foo : change topic to foo
- if len(message_array):
- new_topic = message_array.pop(0)
- gajim.connections[self.account].send_gc_subject(self.room_jid,
- new_topic)
- elif self.subject is not '':
- self.print_conversation(self.subject, 'info')
- else:
- self.print_conversation(_('This group chat has no subject'), 'info')
- self.clear(self.msg_textview)
- return True
- elif command == 'invite':
- # invite a user to a room for a reason
- # example: /invite user@example.com reason
- if len(message_array):
- message_array = message_array[0].split()
- invitee = message_array.pop(0)
- reason = ' '.join(message_array)
- gajim.connections[self.account].send_invite(self.room_jid, invitee,
- reason)
- s = _('Invited %(contact_jid)s to %(room_jid)s.') % {
- 'contact_jid': invitee,
- 'room_jid': self.room_jid}
- self.print_conversation(s, 'info')
- self.clear(self.msg_textview)
- else:
- self.get_command_help(command)
- return True
- elif command == 'join':
- # example: /join room@conference.example.com/nick
- if len(message_array):
- room_jid = message_array[0]
- if room_jid.find('@') < 0:
- room_jid = room_jid + '@' + gajim.get_server_from_jid(
- self.room_jid)
- else:
- room_jid = '@' + gajim.get_server_from_jid(self.room_jid)
- if room_jid.find('/') >= 0:
- room_jid, nick = room_jid.split('/', 1)
- else:
- nick = ''
- # join_gc window is needed in order to provide for password entry.
- if 'join_gc' in gajim.interface.instances[self.account]:
- gajim.interface.instances[self.account]['join_gc'].\
- window.present()
- else:
- try:
- dialogs.JoinGroupchatWindow(account=None, room_jid=room_jid,
- nick=nick)
- except GajimGeneralException:
- pass
- self.clear(self.msg_textview)
- return True
- elif command == 'leave' or command == 'part' or command == 'close':
- # Leave the room and close the tab or window
- reason = 'offline'
- if len(message_array):
- reason = message_array.pop(0)
- self.parent_win.remove_tab(self, self.parent_win.CLOSE_COMMAND, reason)
- self.clear(self.msg_textview)
- return True
- elif command == 'ban':
- if len(message_array):
- room_nicks = gajim.contacts.get_nick_list(self.account,
- self.room_jid)
- nb_match = 0
- nick_ban = ''
- for nick in room_nicks:
- if message_array[0].startswith(nick):
- nb_match += 1
- nick_ban = nick
- test_reason = message_array[0][len(nick) + 1:]
- if len(test_reason) == 0:
- reason = 'None'
- else:
- reason = test_reason
- banned_jid = None
- if nb_match == 1:
- gc_contact = gajim.contacts.get_gc_contact(self.account,
- self.room_jid, nick_ban)
- banned_jid = gc_contact.jid
- elif nb_match > 1:
- self.print_conversation(_('There is an ambiguity: %d nicks '
- 'match.\n Please use graphical interface ') % nb_match,
- 'info')
- self.clear(self.msg_textview)
- elif message_array[0].split()[0].find('@') > 0:
- message_splited = message_array[0].split(' ', 1)
- banned_jid = message_splited[0]
- if len(message_splited) == 2:
- reason = message_splited[1]
- else:
- reason = 'None'
- if banned_jid:
- gajim.connections[self.account].gc_set_affiliation(self.room_jid,
- banned_jid, 'outcast', reason)
- self.clear(self.msg_textview)
- else:
- self.print_conversation(_('Nickname not found'), 'info')
- else:
- self.get_command_help(command)
- return True
- elif command == 'kick':
- if len(message_array):
- nick_kick = ''
- room_nicks = gajim.contacts.get_nick_list(self.account,
- self.room_jid)
- nb_match = 0
- for nick in room_nicks:
- if message_array[0].startswith(nick):
- nb_match += 1
- nick_kick = nick
- test_reason = message_array[0][len(nick) + 1:]
- if len(test_reason) == 0:
- reason = 'None'
- else:
- reason = test_reason
- if nb_match == 1:
- gajim.connections[self.account].gc_set_role(self.room_jid,
- nick_kick, 'none', reason)
- self.clear(self.msg_textview)
- elif nb_match > 1:
- self.print_conversation(_('There is an ambiguity: %d nicks '
- 'match.\n Please use graphical interface') % nb_match ,
- 'info' )
- self.clear(self.msg_textview)
- else:
- # We can't do the difference between nick and reason
- # So we don't say the nick
- self.print_conversation(_('Nickname not found') , 'info')
- else:
- self.get_command_help(command)
- return True
- elif command == 'names':
- # print the list of participants
- nicklist=''
- i=0
- for contact in self.iter_contact_rows():
- nicklist += '[ %-12.12s ] ' % (contact[C_NICK].decode('utf-8'))
- i=i+1
- if i == 3:
- i=0
- self.print_conversation(nicklist, 'info')
- nicklist=''
- if nicklist:
- self.print_conversation(nicklist, 'info')
- self.clear(self.msg_textview)
- return True
- elif command == 'help':
- if len(message_array):
- subcommand = message_array.pop(0)
- self.get_command_help(subcommand)
- else:
- self.get_command_help(command)
- self.clear(self.msg_textview)
- return True
- elif command == 'say':
- gajim.connections[self.account].send_gc_message(self.room_jid,
- message[4:])
- self.clear(self.msg_textview)
- return True
- elif command == 'block':
- if len(message_array) == 0:
- self.get_command_help(command)
- return True
- nick = message_array[0].strip()
- self.on_block(None, nick)
- self.clear(self.msg_textview)
- return True
- elif command == 'unblock':
- if len(message_array) == 0:
- self.get_command_help(command)
- return True
- nick = message_array[0].strip()
- self.on_unblock(None, nick)
- self.clear(self.msg_textview)
- return True
-
- return False
-
def send_message(self, message, xhtml=None):
'''call this function to send our message'''
if not message:
@@ -1778,79 +1517,12 @@ class GroupchatControl(ChatControlBase):
if message != '' or message != '\n':
self.save_sent_message(message)
-
- if not self._process_command(message):
- # Send the message
- gajim.connections[self.account].send_gc_message(self.room_jid,
- message, xhtml=xhtml)
- self.msg_textview.get_buffer().set_text('')
- self.msg_textview.grab_focus()
-
- def get_command_help(self, command):
- if command == 'help':
- self.print_conversation(_('Commands: %s') % GroupchatControl.MUC_CMDS,
- 'info')
- elif command == 'ban':
- s = _('Usage: /%s <nickname|JID> [reason], bans the JID from the group'
- ' chat. The nickname of an occupant may be substituted, but not if '
- 'it contains "@". If the JID is currently in the group chat, '
- 'he/she/it will also be kicked.') % command
- self.print_conversation(s, 'info')
- elif command == 'chat' or command == 'query':
- self.print_conversation(_('Usage: /%s <nickname>, opens a private chat'
- ' window with the specified occupant.') % command, 'info')
- elif command == 'clear':
- self.print_conversation(
- _('Usage: /%s, clears the text window.') % command, 'info')
- elif command == 'close' or command == 'leave' or command == 'part':
- self.print_conversation(_('Usage: /%s [reason], closes the current '
- 'window or tab, displaying reason if specified.') % command, 'info')
- elif command == 'compact':
- self.print_conversation(_('Usage: /%s, hide the chat buttons.') % \
- command, 'info')
- elif command == 'invite':
- self.print_conversation(_('Usage: /%s <JID> [reason], invites JID to '
- 'the current group chat, optionally providing a reason.') % command,
- 'info')
- elif command == 'join':
- self.print_conversation(_('Usage: /%s <room>@<server>[/nickname], '
- 'offers to join room@server optionally using specified nickname.') \
- % command, 'info')
- elif command == 'kick':
- self.print_conversation(_('Usage: /%s <nickname> [reason], removes '
- 'the occupant specified by nickname from the group chat and '
- 'optionally displays a reason.') % command, 'info')
- elif command == 'me':
- self.print_conversation(_('Usage: /%(command)s <action>, sends action '
- 'to the current group chat. Use third person. (e.g. /%(command)s '
- 'explodes.)') % {'command': command}, 'info')
- elif command == 'msg':
- s = _('Usage: /%s <nickname> [message], opens a private message window'
- ' and sends message to the occupant specified by nickname.') % \
- command
- self.print_conversation(s, 'info')
- elif command == 'nick':
- s = _('Usage: /%s <nickname>, changes your nickname in current group '
- 'chat.') % command
- self.print_conversation(s, 'info')
- elif command == 'names':
- s = _('Usage: /%s , display the names of group chat occupants.')\
- % command
- self.print_conversation(s, 'info')
- elif command == 'topic':
- self.print_conversation(_('Usage: /%s [topic], displays or updates the'
- ' current group chat topic.') % command, 'info')
- elif command == 'say':
- self.print_conversation(_('Usage: /%s <message>, sends a message '
- 'without looking for other commands.') % command, 'info')
- elif command == 'block':
- self.print_conversation(_('Usage: /%s <nickname>, prevent <nickname> '
- 'to send you messages or private messages.') % command, 'info')
- elif command == 'unblock':
- self.print_conversation(_('Usage: /%s <nickname>, allow <nickname> '
- 'to send you messages and private messages.') % command, 'info')
- else:
- self.print_conversation(_('No help info for /%s') % command, 'info')
+
+ # Send the message
+ gajim.connections[self.account].send_gc_message(self.room_jid,
+ message, xhtml=xhtml)
+ self.msg_textview.get_buffer().set_text('')
+ self.msg_textview.grab_focus()
def get_role(self, nick):
gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid,
@@ -2100,41 +1772,6 @@ class GroupchatControl(ChatControlBase):
'utf-8')
splitted_text = text.split()
- # topic completion
- splitted_text2 = text.split(None, 1)
- if text.startswith('/topic '):
- if len(splitted_text2) == 2 and \
- self.subject.startswith(splitted_text2[1]) and\
- len(self.subject) > len(splitted_text2[1]):
- message_buffer.insert_at_cursor(
- self.subject[len(splitted_text2[1]):])
- return True
- elif len(splitted_text2) == 1 and text.startswith('/topic '):
- message_buffer.delete(start_iter, end_iter)
- message_buffer.insert_at_cursor('/topic '+self.subject)
- return True
-
- # command completion
- if text.startswith('/') and len(splitted_text) == 1:
- text = splitted_text[0]
- if len(text) == 1: # user wants to cycle all commands
- self.cmd_hits = GroupchatControl.MUC_CMDS
- else:
- # cycle possible commands depending on what the user typed
- if self.last_key_tabs and len(self.cmd_hits) and \
- self.cmd_hits[0].startswith(text.lstrip('/')):
- self.cmd_hits.append(self.cmd_hits[0])
- self.cmd_hits.pop(0)
- else: # find possible commands
- self.cmd_hits = []
- for cmd in GroupchatControl.MUC_CMDS:
- if cmd.startswith(text.lstrip('/')):
- self.cmd_hits.append(cmd)
- if len(self.cmd_hits):
- message_buffer.delete(start_iter, end_iter)
- message_buffer.insert_at_cursor('/' + self.cmd_hits[0] + ' ')
- self.last_key_tabs = True
- return True
# nick completion
# check if tab is pressed with empty message