From a68efd9f17a4255a22d7e63741d723f986b23d0e Mon Sep 17 00:00:00 2001 From: sje Date: Sat, 30 Jun 2007 15:07:52 +0000 Subject: download buddies set status on server added away and invisible status git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@221 4f64403b-2f21-0410-a795-97e2b3489a10 --- MySpace/server_con.cpp | 374 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 286 insertions(+), 88 deletions(-) (limited to 'MySpace/server_con.cpp') diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp index 0aa577c..41aad7d 100644 --- a/MySpace/server_con.cpp +++ b/MySpace/server_con.cpp @@ -3,6 +3,7 @@ #include "net.h" #include "arc4.h" #include "options.h" +#include "nick_dialog.h" #define SERVER_READ_BUFFER_SIZE (1024 * 32) @@ -22,10 +23,103 @@ #define NONCE_SIZE 0x20 int status = ID_STATUS_OFFLINE; -bool server_running = false, server_stop = false; +bool myspace_server_running = false, server_stop = false; HANDLE server_connection = 0; -int sesskey = 0, req_id = 1; +int sesskey = 0, req_id = 1, my_uid = 0; +int signon_status = ID_STATUS_ONLINE; + +int stat_mir_to_myspace(int mir_status) { + switch(mir_status) { + case ID_STATUS_INVISIBLE: return 0; + case ID_STATUS_AWAY: return 5; + case ID_STATUS_ONLINE: return 1; + } + return 0; +} + +int stat_myspace_to_mir(int myspace_status) { + switch(myspace_status) { + case 0: return ID_STATUS_OFFLINE; + case 1: return ID_STATUS_ONLINE; + case 5: return ID_STATUS_AWAY; + } + return 0; +} + +HANDLE FindContact(int uid) { + char *proto; + int cuid; + HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); + while ( hContact != NULL ) + { + proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); + if ( proto && !strcmp( MODULE, proto)) { + cuid = DBGetContactSettingDword(hContact, MODULE, "UID", (DWORD)0); + if(cuid == uid) { + return hContact; + } + } + hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); + } + + return 0; +} + +HANDLE CreateContact(int uid, char *nick, char *email) { + HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); + + if(hContact) { + DBWriteContactSettingDword(hContact, MODULE, "UID", uid); + if(nick && strlen(nick)) { + DBWriteContactSettingStringUtf(hContact, MODULE, "Nick", nick); + } + if(email && strlen(email)) { + DBWriteContactSettingStringUtf(hContact, MODULE, "email", email); + } + + ClientNetMessage msg_add; + msg_add.add_string("addbuddy", ""); + msg_add.add_int("sesskey", sesskey); + msg_add.add_int("newprofileid", uid); + msg_add.add_string("reason", ""); + + SendMessage(msg_add); + + /* + ClientNetMessage msg_block; + msg_block.add_string("blocklist", ""); + msg_block.add_int("sesskey", sesskey); + + char idlist[1024]; + mir_snprintf(idlist, 1024, "b-|%d|a+|%d", mpsr->uid, mpsr->uid); + msg_block.add_string("idlist", idlist); + + SendMessage(msg_block); + */ + + /* + // update contact details? + ClientNetMessage msg_persist; + msg_persist.add_int("persist", 1); + msg_persist.add_int("sesskey", sesskey); + + msg_persist.add_int("cmd", 514); + msg_persist.add_int("dsn", 0); + msg_persist.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0)); + msg_persist.add_int("lid", 9); + msg_persist.add_int("rid", req_id++); + char body[4096]; + mir_snprintf(body, 4096, "ContactID=%d\x1cGroupName=\x1cPosition=1000\x1cVisibility=2\x1cNickName=\x1cNameSelect=0", mpsr->uid); + msg_persist.add_string("body", body); + SendMessage(msg_persist); + */ + + CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)MODULE); + } + + return hContact; +} void SendMessage(ClientNetMessage &msg) { char packet[4096]; @@ -121,7 +215,7 @@ void __cdecl ServerThreadFunc(void*) { int conn_stat = ID_STATUS_CONNECTING; QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat); - server_running = true; + myspace_server_running = true; char *recv_buffer = new char[SERVER_READ_BUFFER_SIZE]; int bytes = 0; @@ -140,13 +234,13 @@ void __cdecl ServerThreadFunc(void*) { bytes = Netlib_Recv(connection, (char *)recv_buffer, SERVER_READ_BUFFER_SIZE, MSG_DUMPASTEXT); if(bytes == 0) { - PUShowMessage("Connection closed", SM_NOTIFY); + //PUShowMessage("Connection closed", SM_NOTIFY); if(login && tries < 9) { conn_data.wPort = try_ports[tries++]; } else break; } else if(bytes == SOCKET_ERROR) { - PUShowMessage("Socket ERROR", SM_NOTIFY); + //PUShowMessage("Socket ERROR", SM_NOTIFY); if(login && tries < 9) { conn_data.wPort = try_ports[tries++]; } else @@ -159,129 +253,233 @@ void __cdecl ServerThreadFunc(void*) { DBWriteContactSettingDword(0, MODULE, "LastPort", conn_data.wPort); } - //mir_snprintf(mt, 256, "recvd %d bytes", bytes); - //PUShowMessage(mt, SM_NOTIFY); + char *pbuff = recv_buffer, *end; + while((end = strstr(pbuff, "\\final\\")) != 0) { + //mir_snprintf(mt, 256, "recvd %d bytes", bytes); + //PUShowMessage(mt, SM_NOTIFY); + if(pbuff != recv_buffer) { + PUShowMessage("Second packet", SM_NOTIFY); + } + end += 7; + *end = 0; - NetMessage msg; - msg.parse(recv_buffer, bytes); - if(msg.exists(NMString("error"))) { - char errmsg[256]; - if(msg.get_string("errmsg", errmsg, 256)) - PUShowMessage(errmsg, SM_WARNING); - } else if(msg.get_int("lc") == 1) { - QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++); - try_login(msg, server_connection); - } else if(msg.get_int("lc") == 2) { - sesskey = msg.get_int("sesskey"); - DBWriteContactSettingDword(0, MODULE, "UID", msg.get_int("userid")); - char nick[256]; - if(msg.get_string("uniquenick", nick, 256)) - DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick); - QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_ONLINE); - } else if(msg.exists(NMString("persistr"))) { - - int cmd, dsn, lid, req; - cmd = msg.get_int("cmd") & 255; - dsn = msg.get_int("dsn"); - lid = msg.get_int("lid"); - req = msg.get_int("rid"); - - mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid); - PUShowMessage(mt, SM_NOTIFY); - if(cmd == 1 && dsn == 5 && lid == 7) { - Dictionary body = msg.get_dict("body"); - char email[256], nick[256]; - int uid = body.get_int("UserID"); - if(uid != 0) { - MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)}; - - if(body.get_string("UserName", nick, 256)) - mpsr.psr.nick = nick; - else if(body.get_string("DisplayName", nick, 256)) - mpsr.psr.nick = nick; - if(body.get_string("Email", email, 256)) - mpsr.psr.email = email; - mpsr.uid = uid; - - ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr); - } else - ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); - } else - if(cmd == 1 && dsn == 4 && lid == 3) { - Dictionary body = msg.get_dict("body"); + NetMessage msg; + msg.parse(recv_buffer, bytes); + if(msg.exists(NMString("error"))) { char errmsg[256]; - if(body.get_string("ErrorMessage", errmsg, 256)) { + if(msg.get_string("errmsg", errmsg, 256)) PUShowMessage(errmsg, SM_WARNING); - ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); - } else { + } else if(msg.get_int("lc") == 1) { + QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++); + try_login(msg, server_connection); + } else if(msg.get_int("lc") == 2) { + sesskey = msg.get_int("sesskey"); + DBWriteContactSettingDword(0, MODULE, "UID", my_uid = msg.get_int("userid")); + char nick[256]; + if(msg.get_string("uniquenick", nick, 256)) + DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick); + QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_ONLINE); + + if(my_uid == msg.get_int("uniquenick")) { + // need to pick a nick + ShowNickDialog(); + } + + + // update our options on server + Dictionary d; + d.add_string("Sound", options.sound ? "True" : "False"); + d.add_int("PrivacyMode", options.privacy_mode); + d.add_string("ShowOnlyToList", options.show_only_to_list ? "True" : "False"); + d.add_int("OfflineMessageMode", options.offline_message_mode); + d.add_string("Headline", ""); + d.add_int("Alert", 1); + d.add_string("ShowAvatar", options.show_avatar ? "True" : "False"); + d.add_string("IMName", options.im_name); + + ClientNetMessage cmsg; + cmsg.add_int("persist", 1); + cmsg.add_int("sesskey", sesskey); + cmsg.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0)); + cmsg.add_int("cmd", 514); + cmsg.add_int("dsn", 1); + cmsg.add_int("lid", 10); + cmsg.add_int("rid", req_id++); + cmsg.add_dict("body", d); + SendMessage(cmsg); + + // set blocklist + ClientNetMessage msg_block; + msg_block.add_string("blocklist", ""); + msg_block.add_int("sesskey", sesskey); + msg_block.add_string("idlist", "w0|c0|a-|*|b-|*"); + SendMessage(msg_block); + + // set status + ClientNetMessage msg_status; + msg_status.add_int("status", stat_mir_to_myspace(signon_status)); + msg_status.add_int("sesskey", sesskey); + msg_status.add_string("statstring", ""); + msg_status.add_string("locstring", ""); + SendMessage(msg_status); + + /* + // set login time? + Dictionary ld; + ld.add_int("ContactType", 1); + ld.add_int("LastLogin", timestamp); + ClientNetMessage msg_setinfo; + msg_setinfo.add_string("setinfo", ""); + msg_block.add_int("sesskey", sesskey); + msg_setinfo.add_dict("info", ld); + SendMessage(msg_setinfo); + */ + } else if(msg.get_int("bm") == 100) { // status message + int uid = msg.get_int("f"); + if(uid) { + HANDLE hContact = FindContact(uid); + if(!hContact) { + hContact = CreateContact(uid, 0, 0); + // lookup user? + } + char smsg[1024]; + if(msg.get_string("msg", smsg, 1024)) { + DBWriteContactSettingWord(hContact, MODULE, "Status", stat_myspace_to_mir(smsg[3] - '0')); + } + } + } else if(msg.exists(NMString("persistr"))) { + int cmd, dsn, lid, req; + cmd = msg.get_int("cmd") & 255; + dsn = msg.get_int("dsn"); + lid = msg.get_int("lid"); + req = msg.get_int("rid"); + + mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid); + PUShowMessage(mt, SM_NOTIFY); + if(cmd == 1 && dsn == 5 && lid == 7) { // userinfo (lookup by username/email) + Dictionary body = msg.get_dict("body"); char email[256], nick[256]; int uid = body.get_int("UserID"); + if(nick_dialog) PostMessage(nick_dialog, WMU_NICKEXISTS, (WPARAM)(uid != 0), msg.get_int("rid")); if(uid != 0) { MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)}; - if(body.get_string("DisplayName", nick, 256)) + if(body.get_string("UserName", nick, 256)) mpsr.psr.nick = nick; - else if(body.get_string("UserName", nick, 256)) + else if(body.get_string("DisplayName", nick, 256)) mpsr.psr.nick = nick; - if(body.get_string("Email", email, 256)) mpsr.psr.email = email; mpsr.uid = uid; ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr); - } else + } + ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); + } else + if(cmd == 1 && dsn == 4 && lid == 3) { // userinfo(lookup by userid) + Dictionary body = msg.get_dict("body"); + char errmsg[256]; + if(body.get_string("ErrorMessage", errmsg, 256)) { + PUShowMessage(errmsg, SM_WARNING); ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); - } - } else - if(cmd == 2 && dsn == 0 && lid == 9) { - Dictionary body = msg.get_dict("body"); - char errmsg[256]; - if(body.get_string("ErrorMessage", errmsg, 256)) { - PUShowMessage(errmsg, SM_WARNING); - } else { - char nick[256]; - int uid = body.get_int("ContactID"); - if(uid != 0) { - if(body.get_string("NickName", nick, 256)) { - DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick); + } else { + char email[256], nick[256]; + int uid = body.get_int("UserID"); + if(uid != 0) { + MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)}; + + if(body.get_string("DisplayName", nick, 256)) + mpsr.psr.nick = nick; + else if(body.get_string("UserName", nick, 256)) + mpsr.psr.nick = nick; + + if(body.get_string("Email", email, 256)) + mpsr.psr.email = email; + mpsr.uid = uid; + + ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr); } + ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); + } + } else + if(cmd == 2 && dsn == 0 && lid == 9) { + Dictionary body = msg.get_dict("body"); + char errmsg[256]; + if(body.get_string("ErrorMessage", errmsg, 256)) { + PUShowMessage(errmsg, SM_WARNING); + } else { + char nick[256]; + int uid = body.get_int("ContactID"); + if(uid != 0) { + if(body.get_string("NickName", nick, 256)) { + DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick); + } + } + } + } else + if(cmd == 2 && dsn == 9 && lid == 14) { + Dictionary body = msg.get_dict("body"); + char errmsg[256]; + if(body.get_string("ErrorMessage", errmsg, 256)) { + PUShowMessage(errmsg, SM_WARNING); + } else { + int code = body.get_int("Code"); + if(nick_dialog) PostMessage(nick_dialog, WMU_CHANGEOK, (WPARAM)(code == 0), msg.get_int("rid")); } } } + pbuff = end + 1; } } } if(server_connection) { + ClientNetMessage msg; + msg.add_string("logout", ""); + msg.add_int("sesskey", sesskey); + SendMessage(msg); Netlib_CloseHandle(server_connection); server_connection = 0; } delete recv_buffer; QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_OFFLINE); - server_running = false; + myspace_server_running = false; + SetAllOffline(); } void StartThread() { - if(!server_running) { + if(!myspace_server_running) { server_stop = false; mir_forkthread(ServerThreadFunc, 0); } } void StopThread() { - if(server_running) { - server_stop = true; - if(server_connection) { - Netlib_CloseHandle(server_connection); - server_connection = 0; - } + if(myspace_server_running) { + ClientNetMessage msg; + msg.add_string("logout", ""); + msg.add_int("sesskey", sesskey); + SendMessage(msg); } } -void InitServerConnection() { - StartThread(); -} - -void DeinitServerConnection() { - StopThread(); +void SetServerStatus(int st) { + if(st == ID_STATUS_OFFLINE) { + StopThread(); + } else { + if(myspace_server_running) { + // set status + ClientNetMessage msg_status; + msg_status.add_int("status", stat_mir_to_myspace(st)); + msg_status.add_int("sesskey", sesskey); + msg_status.add_string("statstring", ""); + msg_status.add_string("locstring", ""); + SendMessage(msg_status); + + QueueUserAPC(sttMainThreadStatusCallback, mainThread, st); + } else { + signon_status = st; + StartThread(); + } + } } -- cgit v1.2.3