/*
Copyright (c) 2015-24 Miranda NG team (https://miranda-ng.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation version 2
of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "stdafx.h"
std::map CSkypeProto::languages;
void CSkypeProto::InitLanguages()
{
std::map result;
result[L"ab"] = L"Abkhazian";
result[L"aa"] = L"Afar";
result[L"af"] = L"Afrikaans";
result[L"ak"] = L"Akan";
result[L"sq"] = L"Albanian";
result[L"am"] = L"Amharic";
result[L"ar"] = L"Arabic";
result[L"an"] = L"Aragonese";
result[L"hy"] = L"Armenian";
result[L"as"] = L"Assamese";
result[L"av"] = L"Avaric";
result[L"ae"] = L"Avestan";
result[L"ay"] = L"Aymara";
result[L"az"] = L"Azerbaijani";
result[L"bm"] = L"Bambara";
result[L"ba"] = L"Bashkir";
result[L"eu"] = L"Basque";
result[L"be"] = L"Belarusian";
result[L"bn"] = L"Bengali";
result[L"bh"] = L"Bihari languages";
result[L"bi"] = L"Bislama";
result[L"nb"] = L"Bokmal, Norwegian";
result[L"bs"] = L"Bosnian";
result[L"br"] = L"Breton";
result[L"bg"] = L"Bulgarian";
result[L"my"] = L"Burmese";
result[L"ca"] = L"Catalan";
result[L"km"] = L"Central Khmer";
result[L"ch"] = L"Chamorro";
result[L"ce"] = L"Chechen";
result[L"ny"] = L"Chichewa";
result[L"zh"] = L"Chinese";
result[L"za"] = L"Chuang";
result[L"cu"] = L"Church Slavic";
result[L"cv"] = L"Chuvash";
result[L"kw"] = L"Cornish";
result[L"co"] = L"Corsican";
result[L"cr"] = L"Cree";
result[L"hr"] = L"Croatian";
result[L"cs"] = L"Czech";
result[L"da"] = L"Danish";
result[L"dv"] = L"Divehi";
result[L"nl"] = L"Dutch";
result[L"dz"] = L"Dzongkha";
result[L"en"] = L"English";
result[L"eo"] = L"Esperanto";
result[L"et"] = L"Estonian";
result[L"ee"] = L"Ewe";
result[L"fo"] = L"Faroese";
result[L"fj"] = L"Fijian";
result[L"fi"] = L"Finnish";
result[L"fr"] = L"French";
result[L"ff"] = L"Fulah";
result[L"gd"] = L"Gaelic";
result[L"gl"] = L"Galician";
result[L"lg"] = L"Ganda";
result[L"ka"] = L"Georgian";
result[L"de"] = L"German";
result[L"ki"] = L"Gikuyu";
result[L"el"] = L"Greek, Modern (1453-)";
result[L"kl"] = L"Greenlandic";
result[L"gn"] = L"Guarani";
result[L"gu"] = L"Gujarati";
result[L"ht"] = L"Haitian Creole";
result[L"ha"] = L"Hausa";
result[L"he"] = L"Hebrew";
result[L"hz"] = L"Herero";
result[L"hi"] = L"Hindi";
result[L"ho"] = L"Hiri Motu";
result[L"hu"] = L"Hungarian";
result[L"is"] = L"Icelandic";
result[L"io"] = L"Ido";
result[L"ig"] = L"Igbo";
result[L"id"] = L"Indonesian";
result[L"ia"] = L"Interlingua (International Auxiliary Language Association)";
result[L"ie"] = L"Interlingue";
result[L"iu"] = L"Inuktitut";
result[L"ik"] = L"Inupiaq";
result[L"ga"] = L"Irish";
result[L"it"] = L"Italian";
result[L"ja"] = L"Japanese";
result[L"jv"] = L"Javanese";
result[L"kn"] = L"Kannada";
result[L"kr"] = L"Kanuri";
result[L"ks"] = L"Kashmiri";
result[L"kk"] = L"Kazakh";
result[L"rw"] = L"Kinyarwanda";
result[L"ky"] = L"Kirghiz";
result[L"kv"] = L"Komi";
result[L"kg"] = L"Kongo";
result[L"ko"] = L"Korean";
result[L"kj"] = L"Kuanyama";
result[L"ku"] = L"Kurdish";
result[L"lo"] = L"Lao";
result[L"la"] = L"Latin";
result[L"lv"] = L"Latvian";
result[L"lb"] = L"Letzeburgesch";
result[L"this"] = L"Limburgan";
result[L"ln"] = L"Lingala";
result[L"lt"] = L"Lithuanian";
result[L"lu"] = L"Luba-Katanga";
result[L"mk"] = L"Macedonian";
result[L"mg"] = L"Malagasy";
result[L"ms"] = L"Malay";
result[L"ml"] = L"Malayalam";
result[L"mt"] = L"Maltese";
result[L"gv"] = L"Manx";
result[L"mi"] = L"Maori";
result[L"mr"] = L"Marathi";
result[L"mh"] = L"Marshallese";
result[L"mn"] = L"Mongolian";
result[L"na"] = L"Nauru";
result[L"nv"] = L"Navajo";
result[L"nd"] = L"Ndebele, North";
result[L"nr"] = L"Ndebele, South";
result[L"ng"] = L"Ndonga";
result[L"ne"] = L"Nepali";
result[L"se"] = L"Northern Sami";
result[L"no"] = L"Norwegian";
result[L"nn"] = L"Norwegian Nynorsk";
result[L"ii"] = L"Nuosu";
result[L"oc"] = L"Occitan (post 1500)";
result[L"oj"] = L"Ojibwa";
result[L"or"] = L"Oriya";
result[L"om"] = L"Oromo";
result[L"os"] = L"Ossetic";
result[L"pi"] = L"Pali";
result[L"pa"] = L"Panjabi";
result[L"ps"] = L"Pashto";
result[L"fa"] = L"Persian";
result[L"pl"] = L"Polish";
result[L"pt"] = L"Portuguese";
result[L"qu"] = L"Quechua";
result[L"ro"] = L"Romanian";
result[L"rm"] = L"Romansh";
result[L"rn"] = L"Rundi";
result[L"ru"] = L"Russian";
result[L"sm"] = L"Samoan";
result[L"sg"] = L"Sango";
result[L"sa"] = L"Sanskrit";
result[L"sc"] = L"Sardinian";
result[L"sr"] = L"Serbian";
result[L"sn"] = L"Shona";
result[L"sd"] = L"Sindhi";
result[L"si"] = L"Sinhalese";
result[L"sk"] = L"Slovak";
result[L"sl"] = L"Slovenian";
result[L"so"] = L"Somali";
result[L"st"] = L"Sotho, Southern";
result[L"es"] = L"Spanish";
result[L"su"] = L"Sundanese";
result[L"sw"] = L"Swahili";
result[L"ss"] = L"Swati";
result[L"sv"] = L"Swedish";
result[L"tl"] = L"Tagalog";
result[L"ty"] = L"Tahitian";
result[L"tg"] = L"Tajik";
result[L"ta"] = L"Tamil";
result[L"tt"] = L"Tatar";
result[L"te"] = L"Telugu";
result[L"th"] = L"Thai";
result[L"bo"] = L"Tibetan";
result[L"ti"] = L"Tigrinya";
result[L"to"] = L"Tonga (Tonga Islands)";
result[L"ts"] = L"Tsonga";
result[L"tn"] = L"Tswana";
result[L"tr"] = L"Turkish";
result[L"tk"] = L"Turkmen";
result[L"tw"] = L"Twi";
result[L"ug"] = L"Uighur";
result[L"uk"] = L"Ukrainian";
result[L"ur"] = L"Urdu";
result[L"uz"] = L"Uzbek";
result[L"ve"] = L"Venda";
result[L"vi"] = L"Vietnamese";
result[L"vo"] = L"Volapuk";
result[L"wa"] = L"Walloon";
result[L"cy"] = L"Welsh";
result[L"fy"] = L"Western Frisian";
result[L"wo"] = L"Wolof";
result[L"xh"] = L"Xhosa";
result[L"yi"] = L"Yiddish";
result[L"yo"] = L"Yoruba";
result[L"zu"] = L"Zulu";
}
void CSkypeProto::UpdateProfileFirstName(const JSONNode &root, MCONTACT hContact)
{
CMStringW firstname = root["firstname"].as_mstring();
if (!firstname.IsEmpty() && firstname != "null")
setWString(hContact, "FirstName", firstname);
else
delSetting(hContact, "FirstName");
}
void CSkypeProto::UpdateProfileLastName(const JSONNode &root, MCONTACT hContact)
{
CMStringW lastname = root["lastname"].as_mstring();
if (!lastname.IsEmpty() && lastname != "null")
setWString(hContact, "LastName", lastname);
else
delSetting(hContact, "LastName");
}
void CSkypeProto::UpdateProfileDisplayName(const JSONNode &root, MCONTACT hContact)
{
ptrW firstname(getWStringA(hContact, "FirstName"));
ptrW lastname(getWStringA(hContact, "LastName"));
if (firstname) {
CMStringW nick(firstname);
if (lastname)
nick.AppendFormat(L" %s", lastname.get());
setWString(hContact, "Nick", nick);
}
else if (lastname)
setWString(hContact, "Nick", lastname);
else {
const JSONNode &node = root["displayname"];
CMStringW displayname((!node) ? root["username"].as_mstring() : node.as_mstring());
if (!displayname.IsEmpty() && displayname != "null")
setWString(hContact, "Nick", displayname);
else
delSetting(hContact, "Nick");
}
}
void CSkypeProto::UpdateProfileGender(const JSONNode &root, MCONTACT hContact)
{
CMStringW gender = root["gender"].as_mstring();
if (!gender.IsEmpty() && gender != "null")
setByte(hContact, "Gender", (uint8_t)(_wtoi(gender) == 1 ? 'M' : 'F'));
else
delSetting(hContact, "Gender");
}
void CSkypeProto::UpdateProfileBirthday(const JSONNode &root, MCONTACT hContact)
{
CMStringW birthday = root["birthday"].as_mstring();
if (!birthday.IsEmpty() && birthday != "null") {
int d, m, y;
swscanf(birthday.GetBuffer(), L"%d-%d-%d", &y, &m, &d);
setWord(hContact, "BirthYear", y);
setByte(hContact, "BirthDay", d);
setByte(hContact, "BirthMonth", m);
}
else {
delSetting(hContact, "BirthYear");
delSetting(hContact, "BirthDay");
delSetting(hContact, "BirthMonth");
}
}
void CSkypeProto::UpdateProfileCountry(const JSONNode &root, MCONTACT hContact)
{
std::string isocode = root["country"].as_string();
if (!isocode.empty() && isocode != "null") {
char *country = (char *)CallService(MS_UTILS_GETCOUNTRYBYISOCODE, (WPARAM)isocode.c_str(), 0);
setString(hContact, "Country", country);
}
else delSetting(hContact, "Country");
}
void CSkypeProto::UpdateProfileState(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["province"].as_mstring();
if (!province.IsEmpty() && province != "null")
setWString(hContact, "State", province);
else
delSetting(hContact, "State");
}
void CSkypeProto::UpdateProfileCity(const JSONNode &root, MCONTACT hContact)
{
CMStringW city = root["city"].as_mstring();
if (!city.IsEmpty() && city != "null")
setWString(hContact, "City", city);
else
delSetting(hContact, "City");
}
void CSkypeProto::UpdateProfileLanguage(const JSONNode &root, MCONTACT hContact)
{
CMStringW isocode = root["language"].as_mstring();
if (!isocode.IsEmpty() && isocode != "null")
setWString(hContact, "Language0", languages[isocode.GetBuffer()].c_str());
else
delSetting(hContact, "Language0");
}
void CSkypeProto::UpdateProfileHomepage(const JSONNode &root, MCONTACT hContact)
{
CMStringW homepage = root["homepage"].as_mstring();
if (!homepage.IsEmpty() && homepage != "null")
setWString(hContact, "Homepage", homepage);
else
delSetting(hContact, "Homepage");
}
void CSkypeProto::UpdateProfileAbout(const JSONNode &root, MCONTACT hContact)
{
CMStringW about = root["about"].as_mstring();
if (!about.IsEmpty() && about != "null")
setWString(hContact, "About", about);
else
delSetting(hContact, "About");
}
void CSkypeProto::UpdateProfileEmails(const JSONNode &root, MCONTACT hContact)
{
const JSONNode &node = root["emails"];
if (node) {
const JSONNode &items = node.as_array();
for (size_t i = 0; i < min(items.size(), 3); i++) {
const JSONNode &item = items.at(i);
if (!item)
break;
CMStringA name(FORMAT, "e-mail%d", i);
setWString(hContact, name, item.as_mstring());
}
}
else {
delSetting(hContact, "e-mail0");
delSetting(hContact, "e-mail1");
delSetting(hContact, "e-mail2");
}
}
void CSkypeProto::UpdateProfilePhoneMobile(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["phoneMobile"].as_mstring();
if (!province.IsEmpty() && province != "null")
setWString(hContact, "Cellular", province);
else
delSetting(hContact, "Cellular");
}
void CSkypeProto::UpdateProfilePhoneHome(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["phone"].as_mstring();
if (!province.IsEmpty() && province != "null")
setWString(hContact, "Phone", province);
else
delSetting(hContact, "Phone");
}
void CSkypeProto::UpdateProfilePhoneOffice(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["phoneOffice"].as_mstring();
if (!province.IsEmpty() && province != "null")
setWString(hContact, "CompanyPhone", province);
else
delSetting(hContact, "CompanyPhone");
}
void CSkypeProto::UpdateProfileXStatusMessage(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["richMood"].as_mstring();
if (!province.IsEmpty() && province != "null")
setWString(hContact, "XStatusMsg", province);
else
delSetting(hContact, "XStatusMsg");
}
void CSkypeProto::UpdateProfileAvatar(const JSONNode &root, MCONTACT hContact)
{
CMStringW province = root["avatarUrl"].as_mstring();
if (!province.IsEmpty() && province != "null") {
SetAvatarUrl(hContact, province);
ReloadAvatarInfo(hContact);
}
}
//{"firstname":"Echo \/ Sound Test Service", "lastname" : null, "birthday" : null, "gender" : null, "country" : null, "city" : null, "language" : null, "homepage" : null, "about" : null, "province" : null, "jobtitle" : null, "emails" : [], "phoneMobile" : null, "phoneHome" : null, "phoneOffice" : null, "mood" : null, "richMood" : null, "avatarUrl" : null, "username" : "echo123"}
void CSkypeProto::LoadProfile(MHttpResponse *response, AsyncHttpRequest *pRequest)
{
MCONTACT hContact = (DWORD_PTR)pRequest->pUserInfo;
JsonReply reply(response);
if (reply.error()) {
ProtoBroadcastAck(hContact, ACKTYPE_GETINFO, ACKRESULT_FAILED, 0);
return;
}
auto &root = reply.data();
std::string username = root["username"].as_string();
if (username.empty()) {
ProtoBroadcastAck(hContact, ACKTYPE_GETINFO, ACKRESULT_FAILED, 0);
return;
}
if (m_szSkypename != username.c_str())
m_szMyname = username.c_str();
else
m_szMyname = m_szSkypename;
UpdateProfileFirstName(root, hContact);
UpdateProfileLastName(root, hContact);
UpdateProfileDisplayName(root, hContact);
UpdateProfileGender(root, hContact);
UpdateProfileBirthday(root, hContact);
UpdateProfileCountry(root, hContact);
UpdateProfileState(root, hContact);
UpdateProfileCity(root, hContact);
UpdateProfileLanguage(root, hContact);
UpdateProfileHomepage(root, hContact);
UpdateProfileAbout(root, hContact);
//jobtitle
UpdateProfileEmails(root, hContact);
UpdateProfilePhoneMobile(root, hContact);
UpdateProfilePhoneHome(root, hContact);
UpdateProfilePhoneOffice(root, hContact);
//richMood
UpdateProfileAvatar(root, hContact);
ProtoBroadcastAck(hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, 0);
}