aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/purple/purple.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/purple/purple.c')
-rw-r--r--protocols/purple/purple.c75
1 files changed, 68 insertions, 7 deletions
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index edd1e9c3..2515f07e 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -113,6 +113,29 @@ static char *purple_get_account_prpl_id(account_t *acc)
return acc->prpl->data;
}
+static gboolean purple_account_should_set_nick(account_t *acc)
+{
+ /* whitelist of protocols that tend to have numeric or meaningless usernames, and should
+ * always offer the 'alias' as a nick. this is just so that users don't have to do
+ * 'account whatever set nick_format %full_name'
+ */
+ char *whitelist[] = {
+ "prpl-hangouts",
+ "prpl-eionrobb-funyahoo-plusplus",
+ "prpl-icq",
+ NULL,
+ };
+ char **p;
+
+ for (p = whitelist; *p; p++) {
+ if (g_strcmp0(acc->prpl->data, *p) == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static void purple_init(account_t *acc)
{
char *prpl_id = purple_get_account_prpl_id(acc);
@@ -379,6 +402,10 @@ static void purple_login(account_t *acc)
purple_account_set_password(pd->account, acc->pass);
purple_sync_settings(acc, pd->account);
+ if (purple_account_should_set_nick(acc)) {
+ pd->flags = PURPLE_OPT_SHOULD_SET_NICK;
+ }
+
purple_account_set_enabled(pd->account, "BitlBee", TRUE);
if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {
@@ -916,17 +943,22 @@ static void prplcb_blist_update(PurpleBuddyList *list, PurpleBlistNode *node)
PurpleBuddy *bud = (PurpleBuddy *) node;
PurpleGroup *group = purple_buddy_get_group(bud);
struct im_connection *ic = purple_ic_by_pa(bud->account);
+ struct purple_data *pd = ic->proto_data;
PurpleStatus *as;
int flags = 0;
+ char *alias = NULL;
if (ic == NULL) {
return;
}
- if (bud->server_alias) {
- imcb_rename_buddy(ic, bud->name, bud->server_alias);
- } else if (bud->alias) {
- imcb_rename_buddy(ic, bud->name, bud->alias);
+ alias = bud->server_alias ? : bud->alias;
+
+ if (alias) {
+ imcb_rename_buddy(ic, bud->name, alias);
+ if (pd->flags & PURPLE_OPT_SHOULD_SET_NICK) {
+ imcb_buddy_nick_change(ic, bud->name, alias);
+ }
}
if (group) {
@@ -1400,16 +1432,30 @@ static void prplcb_roomlist_set_fields(PurpleRoomlist *list, GList *fields)
}
}
+static char *prplcb_roomlist_get_room_name(PurpleRoomlist *list, PurpleRoomlistRoom *room)
+{
+ struct im_connection *ic = purple_ic_by_pa(list->account);
+ struct purple_data *pd = ic->proto_data;
+ PurplePlugin *prpl = purple_plugins_find_with_id(pd->account->protocol_id);
+ PurplePluginProtocolInfo *pi = prpl->info->extra_info;
+
+ if (pi && pi->roomlist_room_serialize) {
+ return pi->roomlist_room_serialize(room);
+ } else {
+ return g_strdup(purple_roomlist_room_get_name(room));
+ }
+}
+
static void prplcb_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *room)
{
bee_chat_info_t *ci;
- const char *title;
+ char *title;
const char *topic;
GList *fields;
struct purple_roomlist_data *rld = list->ui_data;
fields = purple_roomlist_room_get_fields(room);
- title = purple_roomlist_room_get_name(room);
+ title = prplcb_roomlist_get_room_name(list, room);
if (rld->topic >= 0) {
topic = g_list_nth_data(fields, rld->topic);
@@ -1418,7 +1464,7 @@ static void prplcb_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *r
}
ci = g_new(bee_chat_info_t, 1);
- ci->title = g_strdup(title);
+ ci->title = title;
ci->topic = g_strdup(topic);
rld->chats = g_slist_prepend(rld->chats, ci);
}
@@ -1640,6 +1686,10 @@ static void purple_ui_init()
}
}
+/* borrowing this semi-private function
+ * TODO: figure out a better interface later (famous last words) */
+gboolean plugin_info_add(struct plugin_info *info);
+
void purple_initmodule()
{
struct prpl funcs;
@@ -1740,6 +1790,7 @@ void purple_initmodule()
PurplePlugin *prot = prots->data;
PurplePluginProtocolInfo *pi = prot->info->extra_info;
struct prpl *ret;
+ struct plugin_info *info;
/* If we already have this one (as a native module), don't
add a libpurple duplicate. */
@@ -1774,6 +1825,16 @@ void purple_initmodule()
ret->data = NULL;
register_protocol(ret);
}*/
+
+ info = g_new0(struct plugin_info, 1);
+ info->abiver = BITLBEE_ABI_VERSION_CODE;
+ info->name = ret->name;
+ info->version = prot->info->version;
+ info->description = prot->info->description;
+ info->author = prot->info->author;
+ info->url = prot->info->homepage;
+
+ plugin_info_add(info);
}
g_string_append(help, "\n\nFor used protocols, more information about available "