diff options
Diffstat (limited to 'protocols/SkypeWeb/src/skype_mood.cpp')
-rw-r--r-- | protocols/SkypeWeb/src/skype_mood.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/protocols/SkypeWeb/src/skype_mood.cpp b/protocols/SkypeWeb/src/skype_mood.cpp new file mode 100644 index 0000000000..386b64e7f7 --- /dev/null +++ b/protocols/SkypeWeb/src/skype_mood.cpp @@ -0,0 +1,145 @@ +/* +Copyright (C) 2012-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 <http://www.gnu.org/licenses/>. +*/ + +#include "stdafx.h" + +struct +{ + const char *ss; + const wchar_t *defStatus; + int defIcon; +} +static moods[] = +{ + { "", LPGENW("None") }, + { "", LPGENW("Custom emoji") }, + { "brb", LPGENW("Be right back") }, + { "burger", LPGENW("Out for lunch") }, + { "wait", LPGENW("In meetings") }, + { "learn", LPGENW("At school") }, + { "movie", LPGENW("At the movies") }, + { "plane", LPGENW("Traveling") }, + { "party", LPGENW("Celebrating") }, + { "car", LPGENW("Driving") }, + { "skip", LPGENW("At the gym") }, + { "wfh", LPGENW("Working from home") }, +}; + +struct SetStatusMsgRequest : public AsyncHttpRequest +{ + SetStatusMsgRequest(CSkypeProto *ppro) : + AsyncHttpRequest(REQUEST_POST, HOST_API, "/users/self/profile/partial") + { + int iMood = ppro->iMood; + auto &pMood = moods[iMood]; + + JSONNode node, payload; + payload.set_name("payload"); + + CMStringW s1, s2; + switch (iMood) { + case 0: // none + s1 = ppro->wstrMoodMessage; + break; + case 1: // custom + s1.Format(L"(%x) %s", Utf16toUtf32(ppro->wstrMoodEmoji), (wchar_t *)ppro->wstrMoodMessage); + break; + default: + s1.Format(L"(%S) %s", pMood.ss, (wchar_t *)ppro->wstrMoodMessage); + break; + } + payload << WCHAR_PARAM("mood", s1); + + if (iMood > 1) + s2.Format(L"<ss type=\"%S\">(%S)</ss>%s", pMood.ss, pMood.ss, (wchar_t*)ppro->wstrMoodMessage); + else if (iMood == 1) { + int code = Utf16toUtf32(ppro->wstrMoodEmoji); + s2.Format(L"<ss type=\"%x\">(%x)</ss>%s", code, code, (wchar_t *)ppro->wstrMoodMessage); + } + + if (!s2.IsEmpty()) + payload << WCHAR_PARAM("richMood", s2); + + node << payload; + m_szParam = node.write().c_str(); + } +}; + +int getMoodIndex(const char *pszMood) +{ + for (auto &it : moods) + if (!mir_strcmpi(it.ss, pszMood)) + return int(&it - moods); + + return -1; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Mood dialog + +class CMoodDialog : public CSkypeDlg +{ + CCtrlEdit edtText, edtEmoji; + CCtrlCombo cmbMoods; + +public: + CMoodDialog(CSkypeProto *ppro) : + CSkypeDlg(ppro, IDD_MOOD), + edtText(this, IDC_MOOD_TEXT), + edtEmoji(this, IDC_MOOD_EMOJI), + cmbMoods(this, IDC_MOOD_COMBO) + { + CreateLink(edtText, ppro->wstrMoodMessage); + CreateLink(edtEmoji, ppro->wstrMoodEmoji); + + cmbMoods.OnChange = Callback(this, &CMoodDialog::onChangeSel_Mood); + } + + bool OnInitDialog() override + { + for (auto &it : moods) + cmbMoods.AddString(TranslateW(it.defStatus), int(&it - moods)); + cmbMoods.SetCurSel(m_proto->iMood); + return true; + } + + bool OnApply() override + { + m_proto->iMood = cmbMoods.GetCurSel(); + + CMStringA szSetting(FORMAT, "Mood%d", (int)m_proto->iMood); + m_proto->setWString(szSetting, m_proto->wstrMoodMessage); + + m_proto->PushRequest(new SetStatusMsgRequest(m_proto)); + return true; + } + + void onChangeSel_Mood(CCtrlCombo *) + { + int iMood = cmbMoods.GetCurSel(); + edtEmoji.Enable(iMood == 1); + + CMStringA szSetting(FORMAT, "Mood%d", iMood); + edtText.SetText(m_proto->getMStringW(szSetting)); + } +}; + +INT_PTR CSkypeProto::SvcSetMood(WPARAM, LPARAM) +{ + CMoodDialog(this).DoModal(); + return 0; +} |