diff options
author | dequis <dx@dxzone.com.ar> | 2015-04-06 09:30:30 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-04-06 09:35:57 -0300 |
commit | e3e2059c57f051d103645c120934a05ef5e35156 (patch) | |
tree | 14bbaa57556d7d64ba8a821eaeaf1b92bb1018fe /irc_channel.c | |
parent | 69982f8361f8e75d768872fba0e1e94dd1d4e875 (diff) |
irc: split bee_irc_chat_name_hint in a few functions
Also split underscore_dedupe from nick_dedupe.
Diffstat (limited to 'irc_channel.c')
-rw-r--r-- | irc_channel.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/irc_channel.c b/irc_channel.c index b4257ba6..f66efabe 100644 --- a/irc_channel.c +++ b/irc_channel.c @@ -555,6 +555,86 @@ int irc_channel_name_cmp(const char *a_, const char *b_) return case_map[a[i]] - case_map[b[i]]; } +gboolean irc_channel_is_unused(bee_t *bee, char *name) +{ + char *type, *chat_type; + irc_channel_t *oic; + + if (!irc_channel_name_ok(name)) { + return FALSE; + } + + if (!(oic = irc_channel_by_name(bee->ui_data, name))) { + return TRUE; + } + + type = set_getstr(&oic->set, "type"); + chat_type = set_getstr(&oic->set, "chat_type"); + + if (type && chat_type && oic->data == FALSE && + strcmp(type, "chat") == 0 && + strcmp(chat_type, "groupchat") == 0) { + /* There's a channel with this name already, but it looks + like it's not in use yet. Most likely the IRC client + rejoined the channel after a reconnect. Remove it so + we can reuse its name. */ + irc_channel_free(oic); + return TRUE; + } + + return FALSE; +} + +char *irc_channel_name_gen(bee_t *bee, const char *hint) +{ + char name[MAX_NICK_LENGTH + 1] = { 0 }; + char *translit_name; + gsize bytes_written; + + translit_name = g_convert_with_fallback(hint, -1, "ASCII//TRANSLIT", "UTF-8", "", NULL, &bytes_written, NULL); + if (bytes_written > MAX_NICK_LENGTH) { + translit_name[MAX_NICK_LENGTH] = '\0'; + } + + name[0] = '#'; + strncpy(name + 1, translit_name, MAX_NICK_LENGTH - 1); + name[MAX_NICK_LENGTH] = '\0'; + + g_free(translit_name); + + irc_channel_name_strip(name); + + if (set_getbool(&bee->set, "lcnicks")) { + nick_lc(bee->ui_data, name + 1); + } + + while (!irc_channel_is_unused(bee, name)) { + underscore_dedupe(name); + } + + return g_strdup(name); +} + +gboolean irc_channel_name_hint(irc_channel_t *ic, const char *name) +{ + irc_t *irc = ic->irc; + char *full_name; + + /* Don't rename a channel if the user's in it already. */ + if (ic->flags & IRC_CHANNEL_JOINED) { + return FALSE; + } + + if (!(full_name = irc_channel_name_gen(irc->b, name))) { + return FALSE; + } + + g_free(ic->name); + ic->name = full_name; + + return TRUE; +} + static gint irc_channel_user_cmp(gconstpointer a_, gconstpointer b_) { const irc_channel_user_t *a = a_, *b = b_; |