diff options
Diffstat (limited to 'protocols/FacebookRM/src')
| -rw-r--r-- | protocols/FacebookRM/src/constants.h | 6 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/contacts.cpp | 6 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/db.h | 1 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/dialogs.cpp | 2 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/entities.h | 12 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/json.cpp | 37 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/process.cpp | 34 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/proto.cpp | 1 | ||||
| -rw-r--r-- | protocols/FacebookRM/src/resource.h | 1 | 
9 files changed, 64 insertions, 36 deletions
diff --git a/protocols/FacebookRM/src/constants.h b/protocols/FacebookRM/src/constants.h index 3ce1fdb01a..5d1c6f98a6 100644 --- a/protocols/FacebookRM/src/constants.h +++ b/protocols/FacebookRM/src/constants.h @@ -24,7 +24,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  // Product management
  #define FACEBOOK_NAME							"Facebook"
 -#define FACEBOOK_MOBILE							"Facebook (Mobile)"
  #define FACEBOOK_URL_HOMEPAGE					"http://www.facebook.com"
  #define FACEBOOK_URL_REQUESTS					"http://www.facebook.com/n/?reqs.php"
  #define FACEBOOK_URL_MESSAGES					"http://www.facebook.com/n/?inbox"
 @@ -41,6 +40,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define FACEBOOK_SERVER_APPS					"apps.facebook.com"
  #define FACEBOOK_SERVER_DOMAIN					"facebook.com"
 +// Facebook clients
 +#define FACEBOOK_CLIENT							"Facebook"
 +#define FACEBOOK_CLIENT_MOBILE					"Facebook (Mobile)"
 +
  // Limits
  #define FACEBOOK_MESSAGE_LIMIT					200000 // this is guessed limit, in reality it is bigger
  #define FACEBOOK_MESSAGE_LIMIT_TEXT				"200000"
 @@ -63,7 +66,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define DEFAULT_BIG_AVATARS						0
  #define DEFAULT_DISCONNECT_CHAT					0
  #define DEFAULT_MAP_STATUSES					0
 -#define DEFAULT_LOAD_MOBILE						0
  #define DEFAULT_CUSTOM_SMILEYS					0
  #define DEFAULT_LOCAL_TIME						0
  #define DEFAULT_LOAD_PAGES						0
 diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index 432c00187f..adef0e21b0 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -115,7 +115,7 @@ HANDLE FacebookProto::AddToContactList(facebook_user* fbu, ContactType type, boo  			std::string homepage = FACEBOOK_URL_PROFILE + fbu->user_id;
  			setString(hContact, "Homepage", homepage.c_str());
 -			setString(hContact, "MirVer", fbu->status_id == ID_STATUS_ONTHEPHONE ? FACEBOOK_MOBILE : FACEBOOK_NAME);
 +			setTString(hContact, "MirVer", fbu->mobile ? _T(FACEBOOK_CLIENT_MOBILE) : _T(FACEBOOK_CLIENT));
  			db_unset(hContact, "CList", "MyHandle");
 @@ -155,8 +155,8 @@ void FacebookProto::SetAllContactStatuses(int status, bool reset_client)  		if (reset_client) {
  			ptrT mirver( getTStringA(hContact, "MirVer"));
 -			if (!mirver || _tcscmp(mirver, _T(FACEBOOK_NAME)))
 -				setTString(hContact, "MirVer", _T(FACEBOOK_NAME));
 +			if (!mirver || _tcscmp(mirver, _T(FACEBOOK_CLIENT)))
 +				setTString(hContact, "MirVer", _T(FACEBOOK_CLIENT));
  		}
  		if (getWord(hContact, "Status", 0) != status)
 diff --git a/protocols/FacebookRM/src/db.h b/protocols/FacebookRM/src/db.h index 3103070e67..03e4ed507d 100644 --- a/protocols/FacebookRM/src/db.h +++ b/protocols/FacebookRM/src/db.h @@ -44,7 +44,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define FACEBOOK_KEY_BIG_AVATARS			"UseBigAvatars"
  #define FACEBOOK_KEY_DISCONNECT_CHAT		"DisconnectChatEnable"
  #define FACEBOOK_KEY_MAP_STATUSES			"MapStatuses"
 -#define FACEBOOK_KEY_LOAD_MOBILE			"LoadMobile"
  #define FACEBOOK_KEY_CUSTOM_SMILEYS			"CustomSmileys"
  #define FACEBOOK_KEY_MESSAGE_ID				"LastMessageId"
  #define FACEBOOK_KEY_SERVER_TYPE			"ServerType"
 diff --git a/protocols/FacebookRM/src/dialogs.cpp b/protocols/FacebookRM/src/dialogs.cpp index 6381f86eb7..3df11ce99c 100644 --- a/protocols/FacebookRM/src/dialogs.cpp +++ b/protocols/FacebookRM/src/dialogs.cpp @@ -377,7 +377,6 @@ INT_PTR CALLBACK FBOptionsProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp  		LoadDBCheckState(proto, hwnd, IDC_SET_IGNORE_STATUS, FACEBOOK_KEY_DISABLE_STATUS_NOTIFY, DEFAULT_DISABLE_STATUS_NOTIFY);
  		LoadDBCheckState(proto, hwnd, IDC_BIGGER_AVATARS, FACEBOOK_KEY_BIG_AVATARS, DEFAULT_BIG_AVATARS);
 -		LoadDBCheckState(proto, hwnd, IDC_LOAD_MOBILE, FACEBOOK_KEY_LOAD_MOBILE, DEFAULT_LOAD_MOBILE);
  	} return TRUE;
 @@ -423,7 +422,6 @@ INT_PTR CALLBACK FBOptionsProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp  			StoreDBCheckState(proto, hwnd, IDC_SET_IGNORE_STATUS, FACEBOOK_KEY_DISABLE_STATUS_NOTIFY);
  			StoreDBCheckState(proto, hwnd, IDC_BIGGER_AVATARS, FACEBOOK_KEY_BIG_AVATARS);
 -			StoreDBCheckState(proto, hwnd, IDC_LOAD_MOBILE, FACEBOOK_KEY_LOAD_MOBILE);
  			return TRUE;
  		}
 diff --git a/protocols/FacebookRM/src/entities.h b/protocols/FacebookRM/src/entities.h index f1fc57055e..a52c3ed701 100644 --- a/protocols/FacebookRM/src/entities.h +++ b/protocols/FacebookRM/src/entities.h @@ -36,6 +36,8 @@ struct facebook_user  	std::string image_url;
  	bool deleted;
 +	bool idle;
 +	bool mobile;
  	facebook_user()
  	{
 @@ -43,19 +45,21 @@ struct facebook_user  		this->user_id = this->real_name = this->image_url = "";
  		this->status_id = ID_STATUS_OFFLINE;
  		this->gender = this->last_active = 0;
 -		this->deleted = false;
 +		this->deleted = this->idle = this->mobile = false;
  	}
  	facebook_user(facebook_user* fu)
  	{
  		this->handle = fu->handle;
 -		this->image_url = fu->image_url;
 +		this->user_id = fu->user_id;
  		this->real_name = fu->real_name;
  		this->status_id = fu->status_id;
 -		this->user_id = fu->user_id;
  		this->gender = fu->gender;
  		this->last_active = fu->last_active;
 -		this->deleted = fu->deleted;
 +		this->image_url = fu->image_url;
 +		this->deleted = fu->deleted;		
 +		this->idle = fu->idle;
 +		this->mobile = fu->mobile;
  	}
  };
 diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index b5d23b9af5..a103a6f29c 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -80,7 +80,8 @@ int facebook_json_parser::parse_buddy_list(void* data, List::List< facebook_user  				current->user_id = id;
  			}
 -			current->status_id = ID_STATUS_ONTHEPHONE;
 +			current->status_id = ID_STATUS_OFFLINE;
 +			current->mobile = true;
  		}
  	}
 @@ -100,10 +101,36 @@ int facebook_json_parser::parse_buddy_list(void* data, List::List< facebook_user  			current->status_id = ID_STATUS_ONLINE;
 -			// In new version of Facebook "i" means "offline"
 -			JSONNODE *idle = json_get(it, "i");
 -			if (idle != NULL && json_as_bool(idle))
 -				current->status_id = ID_STATUS_OFFLINE;
 +			JSONNODE *p = json_get(it, "p");
 +			if (p != NULL) {
 +				JSONNODE *status = json_get(p, "status"); // this seems to be "active" everytime
 +				JSONNODE *webStatus = json_get(p, "webStatus"); // "active", "idle" or "offline"
 +				JSONNODE *fbAppStatus = json_get(p, "fbAppStatus"); // "offline" or "active"
 +				JSONNODE *messengerStatus = json_get(p, "messengerStatus"); // "offline" or "active"
 +				JSONNODE *otherStatus = json_get(p, "otherStatus"); // "offline" or "active" - this seems to be "active" when webStatus is "idle" or "active" only
 +
 +				// this may never happen
 +				if (json_as_pstring(status) != "active")
 +					current->status_id = ID_STATUS_OFFLINE;
 +
 +				// "webStatus" and "otherStatus" are marked as "WEB" on FB website
 +				if (json_as_pstring(webStatus) == "active" || json_as_pstring(otherStatus) == "active") {
 +					current->status_id = ID_STATUS_ONLINE;
 +					current->mobile = false;
 +				}
 +
 +				// "fbAppStatus" and "messengerStatus" are marked as "MOBILE" on FB website
 +				if (json_as_pstring(fbAppStatus) == "active" || json_as_pstring(messengerStatus) == "active") {
 +					current->status_id = ID_STATUS_ONTHEPHONE;
 +					current->mobile = true;
 +				}
 +
 +				// this is not marked anyhow on website (yet?)
 +				current->idle = json_as_pstring(webStatus) == "idle"
 +					|| json_as_pstring(otherStatus) == "idle"
 +					|| json_as_pstring(fbAppStatus) == "idle"
 +					|| json_as_pstring(messengerStatus) == "idle";
 +			}
  		}
  	}
 diff --git a/protocols/FacebookRM/src/process.cpp b/protocols/FacebookRM/src/process.cpp index 5a9ffb26f5..d62271b1a3 100644 --- a/protocols/FacebookRM/src/process.cpp +++ b/protocols/FacebookRM/src/process.cpp @@ -42,28 +42,24 @@ void FacebookProto::ProcessBuddyList(void* data)  	p->parse_buddy_list(data, &facy.buddies);
  	delete p;
 -	bool use_mobile_status = getByte(FACEBOOK_KEY_LOAD_MOBILE, DEFAULT_LOAD_MOBILE) != 0;
 -
  	for (List::Item< facebook_user >* i = facy.buddies.begin(); i != NULL;)
  	{		
  		facebook_user* fbu = i->data;
 -		bool on_mobile = false;
 -		char *status;
 +		std::string status;
  		switch (fbu->status_id) {
  			case ID_STATUS_OFFLINE:
  				status = "Offline"; break;
  			case ID_STATUS_ONLINE:
  				status = "Online"; break;
  			case ID_STATUS_ONTHEPHONE:
 -				on_mobile = true;
 -				status = "Phone";
 -
 -				if (!use_mobile_status)
 -					fbu->status_id = ID_STATUS_OFFLINE;
 -				break;
 +				status = "Mobile"; break;
  		}
 -		debugLogA("      Now %s: %s", status, fbu->user_id.c_str());
 +		
 +		if (fbu->idle)
 +			status += " (idle)";
 +
 +		debugLogA("      Now %s: %s", status.c_str(), fbu->user_id.c_str());
  		if (!fbu->deleted)
  		{
 @@ -71,14 +67,16 @@ void FacebookProto::ProcessBuddyList(void* data)  			if (!hContact)
  				hContact = AddToContactList(fbu, CONTACT_FRIEND);
 -			DBVARIANT dbv;
 -			TCHAR* client = on_mobile ? _T(FACEBOOK_MOBILE) : _T(FACEBOOK_NAME);
 -			if (!getTString(hContact, "MirVer", &dbv)) {
 -				if (_tcscmp(dbv.ptszVal, client))
 -					setTString(hContact, "MirVer", client);
 -				db_free(&dbv);
 +			ptrT client( getTStringA(hContact, "MirVer"));
 +			if (!client || _tcscmp(client, fbu->mobile ? _T(FACEBOOK_CLIENT_MOBILE) : _T(FACEBOOK_CLIENT)))
 +				setTString(hContact, "MirVer", fbu->mobile ? _T(FACEBOOK_CLIENT_MOBILE) : _T(FACEBOOK_CLIENT));
 +
 +			if (getDword(fbu->handle, "IdleTS", 0) != fbu->last_active) {
 +				if ((fbu->idle || fbu->status_id == ID_STATUS_OFFLINE) && fbu->last_active > 0)
 +					setDword(fbu->handle, "IdleTS", fbu->last_active);
 +				else
 +					delSetting(fbu->handle, "IdleTS");
  			}
 -			else setTString(hContact, "MirVer", client);
  		}
  		if (fbu->status_id == ID_STATUS_OFFLINE || fbu->deleted)
 diff --git a/protocols/FacebookRM/src/proto.cpp b/protocols/FacebookRM/src/proto.cpp index df81e435ae..99c1c9becd 100644 --- a/protocols/FacebookRM/src/proto.cpp +++ b/protocols/FacebookRM/src/proto.cpp @@ -54,6 +54,7 @@ FacebookProto::FacebookProto(const char* proto_name,const TCHAR* username) :  	HookProtoEvent(ME_GC_BUILDMENU,				&FacebookProto::OnGCMenuHook);
  	db_set_resident(m_szModuleName, "Status");
 +	db_set_resident(m_szModuleName, "IdleTS");
  	db_set_resident(m_szModuleName, FACEBOOK_KEY_MESSAGE_ID);
  	InitHotkeys();
 diff --git a/protocols/FacebookRM/src/resource.h b/protocols/FacebookRM/src/resource.h index ff12fa5cd8..e13e3b76b6 100644 --- a/protocols/FacebookRM/src/resource.h +++ b/protocols/FacebookRM/src/resource.h @@ -26,7 +26,6 @@  #define IDC_DISCONNECT_CHAT             1028
  #define IDC_BIGGER_AVATARS              1030
  #define IDC_MAP_STATUSES                1032
 -#define IDC_LOAD_MOBILE                 1033
  #define IDC_CUSTOM_SMILEYS              1034
  #define IDC_USE_LOCAL_TIME              1035
  #define IDC_LOAD_PAGES                  1036
  | 
