/*
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 .
*/
#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 m_iMood = ppro->m_iMood;
auto &pMood = moods[m_iMood];
JSONNode node, payload;
payload.set_name("payload");
CMStringW s1, s2;
switch (m_iMood) {
case 0: // none
s1 = ppro->m_wstrMoodMessage;
break;
case 1: // custom
s1.Format(L"(%x) %s", Utf16toUtf32(ppro->m_wstrMoodEmoji), (wchar_t *)ppro->m_wstrMoodMessage);
break;
default:
s1.Format(L"(%S) %s", pMood.ss, (wchar_t *)ppro->m_wstrMoodMessage);
break;
}
payload << WCHAR_PARAM("mood", s1);
if (m_iMood > 1)
s2.Format(L"(%S)%s", pMood.ss, pMood.ss, (wchar_t*)ppro->m_wstrMoodMessage);
else if (m_iMood == 1) {
int code = Utf16toUtf32(ppro->m_wstrMoodEmoji);
s2.Format(L"(%x)%s", code, code, (wchar_t *)ppro->m_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->m_wstrMoodMessage);
CreateLink(edtEmoji, ppro->m_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->m_iMood);
onChangeSel_Mood(0);
return true;
}
bool OnApply() override
{
m_proto->m_iMood = cmbMoods.GetCurSel();
CMStringA szSetting(FORMAT, "Mood%d", (int)m_proto->m_iMood);
m_proto->setWString(szSetting, m_proto->m_wstrMoodMessage);
m_proto->PushRequest(new SetStatusMsgRequest(m_proto));
return true;
}
void onChangeSel_Mood(CCtrlCombo *)
{
int m_iMood = cmbMoods.GetCurSel();
edtEmoji.Enable(m_iMood == 1);
CMStringA szSetting(FORMAT, "Mood%d", m_iMood);
edtText.SetText(m_proto->getMStringW(szSetting));
}
};
INT_PTR CSkypeProto::SvcSetMood(WPARAM, LPARAM)
{
CMoodDialog(this).DoModal();
return 0;
}