# HG changeset patch # User andrew.victor@mxit.com # Date 1273572030 0 # Node ID 085020c013eb26b7888f9777240457558d540dce # Parent df44288b44eb9bc04d2e83f2f0bcff6437186b8d Add support for the standard Mood API. diff -r df44288b44eb -r 085020c013eb libpurple/protocols/mxit/login.c --- a/libpurple/protocols/mxit/login.c Tue May 11 07:14:31 2010 +0000 +++ b/libpurple/protocols/mxit/login.c Tue May 11 10:00:30 2010 +0000 @@ -67,7 +67,7 @@ /* configure the connection (reference: "libpurple/connection.h") */ con = purple_account_get_connection( account ); con->proto_data = session; - con->flags |= PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC | PURPLE_CONNECTION_HTML; + con->flags |= PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC | PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_SUPPORT_MOODS; session->con = con; /* add account */ diff -r df44288b44eb -r 085020c013eb libpurple/protocols/mxit/mxit.c --- a/libpurple/protocols/mxit/mxit.c Tue May 11 07:14:31 2010 +0000 +++ b/libpurple/protocols/mxit/mxit.c Tue May 11 10:00:30 2010 +0000 @@ -92,6 +92,9 @@ goto skip; con = purple_account_get_connection( account ); +// /* determine if it's a command-response to send */ +// is_command = g_str_has_prefix( parts[4], "::type=reply|" ); + /* send click message back to MXit */ mxit_send_message( con->proto_data, parts[3], parts[4], FALSE, is_command ); @@ -418,6 +421,26 @@ char* statusmsg1; char* statusmsg2; + /* Handle mood changes */ + if (purple_status_type_get_primitive(purple_status_get_type(status)) == PURPLE_STATUS_MOOD) { + const char* moodid = purple_status_get_attr_string( status, PURPLE_MOOD_NAME ); + int mood; + + /* convert the purple mood to a mxit mood */ + mood = mxit_convert_mood( moodid ); + if ( mood < 0 ) { + /* error, mood not found */ + purple_debug_info( MXIT_PLUGIN_ID, "Mood status NOT found! (id = %s)\n", moodid ); + return; + } + + /* Save the new mood in session */ + session->mood = mood; + + mxit_send_mood( session, mood ); + return; + } + /* get the status id (reference: "libpurple/status.h") */ statusid = purple_status_get_id( status ); @@ -635,7 +658,7 @@ mxit_get_text_table, /* get_account_text_table */ NULL, /* initiate_media */ NULL, /* get_media_caps */ - NULL, /* get_moods */ + mxit_get_moods, /* get_moods */ NULL, /* set_public_alias */ NULL /* get_public_alias */ }; diff -r df44288b44eb -r 085020c013eb libpurple/protocols/mxit/roster.c --- a/libpurple/protocols/mxit/roster.c Tue May 11 07:14:31 2010 +0000 +++ b/libpurple/protocols/mxit/roster.c Tue May 11 10:00:30 2010 +0000 @@ -81,6 +81,12 @@ statuslist = g_list_append( statuslist, type ); } + /* add Mood option */ + type = purple_status_type_new_with_attrs(PURPLE_STATUS_MOOD, "mood", NULL, FALSE, TRUE, TRUE, + PURPLE_MOOD_NAME, _("Mood Name"), purple_value_new( PURPLE_TYPE_STRING ), + NULL); + statuslist = g_list_append( statuslist, type ); + return statuslist; } @@ -127,6 +133,57 @@ * Moods */ +/* moods (reference: libpurple/status.h) */ +static PurpleMood mxit_moods[] = { + {"angry", N_("Angry"), NULL}, + {"excited", N_("Excited"), NULL}, + {"grumpy", N_("Grumpy"), NULL}, + {"happy", N_("Happy"), NULL}, + {"in_love", N_("In love"), NULL}, + {"invincible", N_("Invincible"), NULL}, + {"sad", N_("Sad"), NULL}, + {"hot", N_("Hot"), NULL}, + {"sick", N_("Sick"), NULL}, + {"sleepy", N_("Sleepy"), NULL}, + /* Mark the last record. */ + { NULL, NULL, NULL } +}; + + +/*------------------------------------------------------------------------ + * Returns the MXit mood code, given the unique mood ID. + * + * @param id The mood ID + * @return The MXit mood code + */ +int mxit_convert_mood( const char* id ) +{ + unsigned int i; + + /* Mood is being unset */ + if ( id == NULL ) + return MXIT_MOOD_NONE; + + for ( i = 0; i < ARRAY_SIZE( mxit_moods ) - 1; i++ ) { + if ( strcmp( mxit_moods[i].mood, id ) == 0 ) /* mood found! */ + return i + 1; /* because MXIT_MOOD_NONE is 0 */ + } + + return -1; +} + + +/*------------------------------------------------------------------------ + * Return the list of MXit-supported moods. + * + * @param account The MXit account object + */ +PurpleMood* mxit_get_moods(PurpleAccount *account) +{ + return mxit_moods; +} + + /*------------------------------------------------------------------------ * Returns the MXit mood as a string, given the MXit mood's ID. * @@ -259,6 +316,12 @@ else purple_prpl_got_user_status( session->acc, newbuddy->name, mxit_statuses[contact->presence].id, NULL ); + /* update the buddy's mood */ + if ( contact->mood == MXIT_MOOD_NONE ) + purple_prpl_got_user_status_deactive( session->acc, newbuddy->name, "mood" ); + else + purple_prpl_got_user_status( session->acc, newbuddy->name, "mood", PURPLE_MOOD_NAME, mxit_moods[contact->mood-1].mood, NULL ); + /* update avatar */ if ( contact->avatarId ) { mxit_get_avatar( session, newbuddy->name, contact->avatarId ); @@ -346,6 +409,12 @@ /* update the buddy's status (reference: "libpurple/prpl.h") */ purple_prpl_got_user_status( session->acc, contact->username, mxit_statuses[contact->presence].id, NULL ); + + /* update the buddy's mood */ + if ( contact->mood == MXIT_MOOD_NONE ) + purple_prpl_got_user_status_deactive( session->acc, contact->username, "mood" ); + else + purple_prpl_got_user_status( session->acc, contact->username, "mood", PURPLE_MOOD_NAME, mxit_moods[contact->mood-1].mood, NULL ); } @@ -388,6 +457,10 @@ contact->presence = presence; contact->mood = mood; + /* validate mood */ + if (( contact->mood < MXIT_MOOD_NONE ) || ( contact->mood > MXIT_MOOD_SLEEPY )) + contact->mood = MXIT_MOOD_NONE; + g_strlcpy( contact->customMood, customMood, sizeof( contact->customMood ) ); // TODO: Download custom mood frame. @@ -419,6 +492,12 @@ purple_prpl_got_user_status( session->acc, username, mxit_statuses[contact->presence].id, "message", contact->statusMsg, NULL ); else purple_prpl_got_user_status( session->acc, username, mxit_statuses[contact->presence].id, NULL ); + + /* update the buddy's mood */ + if ( contact->mood == MXIT_MOOD_NONE ) + purple_prpl_got_user_status_deactive( session->acc, username, "mood" ); + else + purple_prpl_got_user_status( session->acc, username, "mood", PURPLE_MOOD_NAME, mxit_moods[contact->mood-1].mood, NULL ); } diff -r df44288b44eb -r 085020c013eb libpurple/protocols/mxit/roster.h --- a/libpurple/protocols/mxit/roster.h Tue May 11 07:14:31 2010 +0000 +++ b/libpurple/protocols/mxit/roster.h Tue May 11 10:00:30 2010 +0000 @@ -119,6 +119,7 @@ const char* mxit_convert_subtype_to_name( short subtype ); /* Moods */ +int mxit_convert_mood( const char* id ); const char* mxit_convert_mood_to_name( short id ); /* MXit Protocol callbacks */ @@ -134,6 +135,7 @@ void mxit_buddy_alias( PurpleConnection* gc, const char* who, const char* alias ); void mxit_buddy_group( PurpleConnection* gc, const char* who, const char* old_group, const char* new_group ); void mxit_rename_group( PurpleConnection* gc, const char* old_name, PurpleGroup* group, GList* moved_buddies ); +PurpleMood* mxit_get_moods(PurpleAccount *account); #endif /* _MXIT_ROSTER_H_ */