@@ -346,6 +346,7 @@ typedef struct {
346346 GHashTable * guild_memberships ;
347347 gboolean bot ;
348348 gchar * custom_status ;
349+ gchar * global_name ;
349350} DiscordUser ;
350351
351352typedef struct {
@@ -506,6 +507,7 @@ discord_new_user(JsonObject *json)
506507 user -> discriminator = to_int (json_object_get_string_member (json , "discriminator" ));
507508 user -> bot = json_object_get_boolean_member (json , "bot" );
508509 user -> avatar = g_strdup (json_object_get_string_member (json , "avatar" ));
510+ user -> global_name = g_strdup (json_object_get_string_member (json , "global_name" ));
509511
510512 user -> guild_memberships = g_hash_table_new_full (g_int64_hash , g_int64_equal , NULL , discord_free_guild_membership );
511513 user -> status = user -> bot ? USER_ONLINE : USER_OFFLINE ; /* Is offline the best assumption on a new user? */
@@ -666,6 +668,7 @@ discord_free_user(gpointer data)
666668 g_free (user -> game );
667669 g_free (user -> avatar );
668670 g_free (user -> custom_status );
671+ g_free (user -> global_name );
669672
670673 g_hash_table_unref (user -> guild_memberships );
671674 g_free (user );
@@ -2397,6 +2400,18 @@ discord_get_real_name(PurpleConnection *pc, gint id, const char *who)
23972400 return g_strdup (who );
23982401}
23992402
2403+ static gchar *
2404+ discord_get_cb_alias (PurpleConnection * pc , int id , const char * who )
2405+ {
2406+ DiscordAccount * da = purple_connection_get_protocol_data (pc );
2407+ DiscordUser * user = discord_get_user_fullname (da , who );
2408+ if (user && user -> global_name ) {
2409+ return g_strdup (user -> global_name );
2410+ }
2411+
2412+ return discord_get_real_name (pc , id , who );
2413+ }
2414+
24002415static time_t
24012416discord_parse_timestring (const gchar * timestring )
24022417{
@@ -3919,6 +3934,14 @@ discord_process_dispatch(DiscordAccount *da, const gchar *type, JsonObject *data
39193934 discord_get_avatar (da , user , TRUE);
39203935 }
39213936
3937+ // Handle global name change
3938+ const gchar * new_global_name = json_object_get_string_member (userdata , "global_name" );
3939+ if (!purple_strequal (user -> global_name , new_global_name )) {
3940+ g_free (user -> global_name );
3941+ user -> global_name = g_strdup (new_global_name );
3942+ purple_serv_got_alias (da -> pc , username , user -> global_name );
3943+ }
3944+
39223945 // Handle a user being renamed
39233946 const gchar * new_username = json_object_get_string_member (userdata , "username" );
39243947 const gchar * new_discriminator = json_object_get_string_member (userdata , "discriminator" );
@@ -5199,6 +5222,9 @@ discord_create_relationship(DiscordAccount *da, JsonObject *json)
51995222 }
52005223
52015224 discord_get_avatar (da , user , TRUE);
5225+ if (user -> global_name && * user -> global_name ) {
5226+ purple_serv_got_alias (da -> pc , merged_username , user -> global_name );
5227+ }
52025228
52035229 } else if (type == RELATIONSHIP_BLOCKED ) {
52045230 /* blocked buddy */
@@ -10421,6 +10447,20 @@ typedef struct
1042110447{
1042210448 PurplePluginProtocolInfo parent ;
1042310449
10450+ GHashTable * (* get_account_text_table )(PurpleAccount * account );
10451+ #if !PURPLE_VERSION_CHECK (2 , 6 , 0 )
10452+ gboolean (* initiate_media )(PurpleAccount * account , const char * who , PurpleMediaSessionType type );
10453+ PurpleMediaCaps (* get_media_caps )(PurpleAccount * account , const char * who );
10454+ #endif
10455+ #if !PURPLE_VERSION_CHECK (2 , 7 , 0 )
10456+ PurpleMood * (* get_moods )(PurpleAccount * account );
10457+ void (* set_public_alias )(PurpleConnection * gc , const char * alias , PurpleSetPublicAliasSuccessCallback success_cb , PurpleSetPublicAliasFailureCallback failure_cb );
10458+ void (* get_public_alias )(PurpleConnection * gc , PurpleGetPublicAliasSuccessCallback success_cb , PurpleGetPublicAliasFailureCallback failure_cb );
10459+ #endif
10460+ #if !PURPLE_VERSION_CHECK (2 , 8 , 0 )
10461+ void (* add_buddy_with_invite )(PurpleConnection * pc , PurpleBuddy * buddy , PurpleGroup * group , const char * message );
10462+ void (* add_buddies_with_invite )(PurpleConnection * pc , GList * buddies , GList * groups , const char * message );
10463+ #endif
1042410464 #if !PURPLE_VERSION_CHECK (2 , 14 , 0 )
1042510465 char * (* get_cb_alias )(PurpleConnection * gc , int id , const char * who );
1042610466 gboolean (* chat_can_receive_file )(PurpleConnection * , int id );
@@ -10450,7 +10490,7 @@ plugin_init(PurplePlugin *plugin)
1045010490
1045110491 info -> extra_info = prpl_info ;
1045210492#if PURPLE_MINOR_VERSION >= 5
10453- prpl_info -> struct_size = sizeof (PurplePluginProtocolInfo );
10493+ prpl_info -> struct_size = sizeof (PurplePluginProtocolInfoExt );
1045410494#endif
1045510495#if PURPLE_MINOR_VERSION >= 8
1045610496/* prpl_info->add_buddy_with_invite = discord_add_buddy_with_invite; */
@@ -10505,6 +10545,11 @@ plugin_init(PurplePlugin *plugin)
1050510545 prpl_info_ext -> chat_send_file = discord_chat_send_file ;
1050610546 prpl_info_ext -> chat_can_receive_file = discord_chat_can_receive_file ;
1050710547 #endif
10548+ #if PURPLE_VERSION_CHECK (2 , 14 , 0 )
10549+ prpl_info -> get_cb_alias = discord_get_cb_alias ;
10550+ #else
10551+ prpl_info_ext -> get_cb_alias = discord_get_cb_alias ;
10552+ #endif
1050810553
1050910554 prpl_info -> roomlist_get_list = discord_roomlist_get_list ;
1051010555 prpl_info -> roomlist_room_serialize = discord_roomlist_serialize ;
0 commit comments