diff options
Diffstat (limited to 'libempathy-gtk/empathy-chat.c')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 73 |
1 files changed, 62 insertions, 11 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 1f5225348..1729e5305 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -1161,6 +1161,56 @@ chat_contacts_completion_func (const gchar *s1, return ret; } +static gchar * +build_part_message (guint reason, + const gchar *name, + EmpathyContact *actor, + const gchar *message) +{ + GString *s = g_string_new (""); + const gchar *actor_name = NULL; + + if (actor != NULL) { + actor_name = empathy_contact_get_name (actor); + } + + /* Having an actor only really makes sense for a few actions... */ + switch (reason) { + case TP_CHANNEL_GROUP_CHANGE_REASON_OFFLINE: + g_string_append_printf (s, _("%s has disconnected"), name); + break; + case TP_CHANNEL_GROUP_CHANGE_REASON_KICKED: + if (actor_name != NULL) { + g_string_append_printf (s, _("%s was kicked by %s"), + name, actor_name); + } else { + g_string_append_printf (s, _("%s was kicked"), name); + } + break; + case TP_CHANNEL_GROUP_CHANGE_REASON_BANNED: + if (actor_name != NULL) { + g_string_append_printf (s, _("%s was banned by %s"), + name, actor_name); + } else { + g_string_append_printf (s, _("%s was banned"), name); + } + break; + default: + g_string_append_printf (s, _("%s has left the room"), name); + } + + if (!EMP_STR_EMPTY (message)) { + /* Note to translators: this string is appended to + * notifications like "foo has left the room", with the message + * given by the user living the room. If this poses a problem, + * please let us know. :-) + */ + g_string_append_printf (s, _(" (%s)"), message); + } + + return g_string_free (s, FALSE); +} + static void chat_members_changed_cb (EmpathyTpChat *tp_chat, EmpathyContact *contact, @@ -1171,20 +1221,21 @@ chat_members_changed_cb (EmpathyTpChat *tp_chat, EmpathyChat *chat) { EmpathyChatPriv *priv = GET_PRIV (chat); + const gchar *name = empathy_contact_get_name (contact); + gchar *str; - if (priv->block_events_timeout_id == 0) { - gchar *str; + if (priv->block_events_timeout_id != 0) + return; - if (is_member) { - str = g_strdup_printf (_("%s has joined the room"), - empathy_contact_get_name (contact)); - } else { - str = g_strdup_printf (_("%s has left the room"), - empathy_contact_get_name (contact)); - } - empathy_chat_view_append_event (chat->view, str); - g_free (str); + if (is_member) { + str = g_strdup_printf (_("%s has joined the room"), + name); + } else { + str = build_part_message (reason, name, actor, message); } + + empathy_chat_view_append_event (chat->view, str); + g_free (str); } static gboolean |