# HG changeset patch # User Nathan Walp # Date 1074660934 0 # Node ID e283be34aadf4e3f51610b8930eddf7712301d03 # Parent 657b5acaec484b903653afac400dab9ae5db7dae [gaim-migrate @ 8870] this hasn't crahed on me yet, and lets chats know what your nick is on a per-room basis, since Jabber is cool enough to let you be different nicks in different rooms committer: Tailor Script diff -r 657b5acaec48 -r e283be34aadf src/conversation.c --- a/src/conversation.c Wed Jan 21 04:51:29 2004 +0000 +++ b/src/conversation.c Wed Jan 21 04:55:34 2004 +0000 @@ -85,59 +85,27 @@ } static gboolean -find_nick(GaimConnection *gc, const char *message) +find_nick(const char *nick, const char *message) { - GaimAccount *account; char *msg, *who, *p; - const char *disp; int n; - - account = gaim_connection_get_account(gc); + gboolean ret = FALSE; msg = g_utf8_strdown(message, -1); - who = g_utf8_strdown(gaim_account_get_username(account), -1); + who = g_utf8_strdown(nick, -1); n = strlen(who); if ((p = strstr(msg, who)) != NULL) { if ((p == msg || !isalnum(*(p - 1))) && !isalnum(*(p + n))) { - g_free(who); - g_free(msg); - - return TRUE; + ret = TRUE; } } g_free(who); - - disp = gaim_connection_get_display_name(gc); - - - if(disp) { - if (!gaim_utf8_strcasecmp(gaim_account_get_username(account), disp)) { - g_free(msg); - - return FALSE; - } - - who = g_utf8_strdown(disp, -1); - n = who ? strlen(who) : 0; - - if (n > 0 && (p = strstr(msg, who)) != NULL) { - if ((p == msg || !isalnum(*(p - 1))) && !isalnum(*(p + n))) { - g_free(who); - g_free(msg); - - return TRUE; - } - } - - g_free(who); - } - g_free(msg); - return FALSE; + return ret; } static gboolean @@ -817,10 +785,17 @@ } else if (type == GAIM_CONV_CHAT) { + const char *disp; + conv->u.chat = g_new0(GaimConvChat, 1); conv->u.chat->conv = conv; chats = g_list_append(chats, conv); + if((disp = gaim_connection_get_display_name(account->gc))) { + gaim_conv_chat_set_nick(conv->u.chat, disp); + } else { + gaim_conv_chat_set_nick(conv->u.chat, gaim_account_get_username(account)); + } gaim_conversation_set_logging(conv, gaim_prefs_get_bool("/core/logging/log_chats")); @@ -1855,20 +1830,17 @@ if (!(flags & GAIM_MESSAGE_WHISPER)) { char *str; - const char *disp; + const char *nick; str = g_strdup(gaim_normalize(account, who)); - disp = gaim_connection_get_display_name(gc); - - if (!gaim_utf8_strcasecmp(str, gaim_normalize(account, gaim_account_get_username(account))) || - (disp && !gaim_utf8_strcasecmp(str, gaim_normalize(account, disp)))) { - + nick = gaim_conv_chat_get_nick(chat); + + if (!g_utf8_collate(str, gaim_normalize(account, nick))) { flags |= GAIM_MESSAGE_SEND; - } - else { + } else { flags |= GAIM_MESSAGE_RECV; - if (find_nick(gc, message)) + if (find_nick(chat->nick, message)) flags |= GAIM_MESSAGE_NICK; } @@ -1969,6 +1941,7 @@ GaimConversationUiOps *ops; char tmp[BUF_LONG]; GList *names; + gboolean its_me = FALSE; g_return_if_fail(chat != NULL); g_return_if_fail(old_user != NULL); @@ -2002,9 +1975,19 @@ else if (gaim_conv_chat_is_user_ignored(chat, new_user)) gaim_conv_chat_unignore(chat, new_user); + if(!g_utf8_collate(old_user, chat->nick)) { + gaim_conv_chat_set_nick(chat, new_user); + its_me = TRUE; + } + if (gaim_prefs_get_bool("/core/conversations/chat/show_nick_change")) { - g_snprintf(tmp, sizeof(tmp), - _("%s is now known as %s"), old_user, new_user); + if(its_me) { + g_snprintf(tmp, sizeof(tmp), + _("You are now known as %s"), new_user); + } else { + g_snprintf(tmp, sizeof(tmp), + _("%s is now known as %s"), old_user, new_user); + } gaim_conversation_write(conv, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); } @@ -2166,6 +2149,20 @@ gaim_conv_chat_set_users(chat, NULL); } +void gaim_conv_chat_set_nick(GaimConvChat *chat, const char *nick) { + g_return_if_fail(chat != NULL); + + if(chat->nick) + g_free(chat->nick); + chat->nick = g_strdup(nick); +} + +const char *gaim_conv_chat_get_nick(GaimConvChat *chat) { + g_return_val_if_fail(chat != NULL, NULL); + + return chat->nick; +} + GaimConversation * gaim_find_chat(const GaimConnection *gc, int id) { diff -r 657b5acaec48 -r e283be34aadf src/conversation.h --- a/src/conversation.h Wed Jan 21 04:51:29 2004 +0000 +++ b/src/conversation.h Wed Jan 21 04:55:34 2004 +0000 @@ -223,6 +223,7 @@ char *who; /**< The person who set the topic. */ char *topic; /**< The topic. */ int id; /**< The chat ID. */ + char *nick; /**< Your nick in this chat. */ }; /** @@ -244,9 +245,9 @@ char *title; /**< The window title. */ gboolean logging; /**< The status of logging. */ - + GaimLog *log; /**< This conversation's log */ - + GList *send_history; /**< The send history. */ GString *history; /**< The conversation history. */ @@ -1180,6 +1181,22 @@ void gaim_conv_chat_clear_users(GaimConvChat *chat); /** + * Sets your nickname (used for hilighting) for a chat. + * + * @param chat The chat. + * @param nick The nick. + */ +void gaim_conv_chat_set_nick(GaimConvChat *chat, const char *nick); + +/** + * Gets your nickname (used for hilighting) for a chat. + * + * @param chat The chat. + * @return The nick. + */ +const char *gaim_conv_chat_get_nick(GaimConvChat *chat); + +/** * Finds a chat with the specified chat ID. * * @param gc The gaim_connection. diff -r 657b5acaec48 -r e283be34aadf src/protocols/jabber/chat.c --- a/src/protocols/jabber/chat.c Wed Jan 21 04:51:29 2004 +0000 +++ b/src/protocols/jabber/chat.c Wed Jan 21 04:55:34 2004 +0000 @@ -190,7 +190,6 @@ chat->room = g_strdup(room); chat->server = g_strdup(server); - chat->nick = g_strdup(handle); g_hash_table_insert(js->chats, room_jid, chat); @@ -233,7 +232,6 @@ g_free(chat->room); g_free(chat->server); - g_free(chat->nick); g_free(chat); } @@ -588,8 +586,6 @@ xmlnode *presence; room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); - gaim_debug(GAIM_DEBUG_INFO, "jabber", "%s is leaving chat %s\n", - chat->nick, room_jid); presence = xmlnode_new("presence"); xmlnode_set_attrib(presence, "to", room_jid); xmlnode_set_attrib(presence, "type", "unavailable"); diff -r 657b5acaec48 -r e283be34aadf src/protocols/jabber/chat.h --- a/src/protocols/jabber/chat.h Wed Jan 21 04:51:29 2004 +0000 +++ b/src/protocols/jabber/chat.h Wed Jan 21 04:55:34 2004 +0000 @@ -34,7 +34,6 @@ JabberStream *js; char *room; char *server; - char *nick; int id; GaimConversation *conv; gboolean muc; diff -r 657b5acaec48 -r e283be34aadf src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Wed Jan 21 04:51:29 2004 +0000 +++ b/src/protocols/jabber/jabber.c Wed Jan 21 04:55:34 2004 +0000 @@ -1102,7 +1102,8 @@ if(!(server = g_hash_table_lookup(chat->components, "server"))) continue; - if(!g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) { + if(jid->node && jid->domain && + !g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) { jabber_id_free(jid); return chat; } diff -r 657b5acaec48 -r e283be34aadf src/protocols/jabber/presence.c --- a/src/protocols/jabber/presence.c Wed Jan 21 04:51:29 2004 +0000 +++ b/src/protocols/jabber/presence.c Wed Jan 21 04:55:34 2004 +0000 @@ -307,6 +307,7 @@ chat->id = i++; chat->muc = muc; chat->conv = serv_got_joined_chat(js->gc, chat->id, room_jid); + gaim_conv_chat_set_nick(GAIM_CONV_CHAT(chat->conv), jid->resource); } if(type && !strcmp(type, "unavailable")) { @@ -331,15 +332,11 @@ continue; nick_change = TRUE; gaim_conv_chat_rename_user(GAIM_CONV_CHAT(chat->conv), jid->resource, nick); - if(!g_utf8_collate(jid->resource, chat->nick)) { - g_free(chat->nick); - chat->nick = g_strdup(nick); - } break; } } if(!nick_change) { - if(!strcmp(jid->resource, chat->nick)) { + if(!g_utf8_collate(jid->resource, gaim_conv_chat_get_nick(GAIM_CONV_CHAT(chat->conv)))) { serv_got_chat_left(js->gc, chat->id); jabber_chat_destroy(chat); } else {