/*
Copyright (c) 2014-17 Robert Pösel, 2017-24 Miranda NG team
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"
const ttemplate templates[] =
{
{ LPGEN("Custom"), "", "" },
{ "AIM", "SN", LPGEN("Screen name") },
{ "Discord", "id", LPGEN("Discord ID") },
{ "EmLAN", "Nick", LPGEN("User name") },
{ "Facebook", "ID", LPGEN("Facebook ID") },
{ "GG", "UIN", LPGEN("Gadu-Gadu number") },
{ "ICQ", "aimId", LPGEN("User ID") },
{ "ICQCorp", "UIN", LPGEN("ICQ number") },
{ "IRC", "Nick", LPGEN("Nickname") },
{ "Jabber", "jid", LPGEN("JID") },
{ "MinecraftDynmap", "Nick", LPGEN("Visible name") },
{ "MRA", "e-mail", LPGEN("E-mail address") },
{ "MSN", "wlid", LPGEN("Live ID") },
{ "Omegle", "nick", LPGEN("Visible name") },
{ "Sametime", "stid", LPGEN("ID") },
{ "Skype (SkypeKit)", "sid", LPGEN("Skype name") },
{ "Skype (Classic)", "Username", LPGEN("Skype name") },
{ "Skype (Web)", "Username", LPGEN("Skype name") },
{ "Steam", "SteamID", LPGEN("Steam ID") },
{ "Telegram", "id", LPGEN("Telegram ID") },
{ "Tlen", "jid", LPGEN("Tlen login") },
{ "Tox", "ToxID", LPGEN("Tox ID") },
{ "Twitter", "Username", LPGEN("Username") },
{ "VK", "ID", LPGEN("VKontakte ID") },
{ "WhatsApp", "ID", LPGEN("WhatsApp ID") },
{ "XFire", "Username", LPGEN("Username") },
{ "Yahoo", "yahoo_id", LPGEN("ID") },
};
void FillTemplateCombo(HWND hwndDlg, int iCtrlId)
{
for (auto &it : templates) {
int i = &it - templates;
SendDlgItemMessageA(hwndDlg, iCtrlId, CB_INSERTSTRING, i, LPARAM(i == 0 ? Translate(it.name) : it.name));
}
}
void CDummyProto::SearchIdAckThread(void *targ)
{
PROTOSEARCHRESULT psr = { 0 };
psr.cbSize = sizeof(psr);
psr.flags = PSR_UNICODE;
psr.id.w = (wchar_t*)targ;
ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, targ, (LPARAM)&psr);
ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, targ, 0);
mir_free(targ);
}
/////////////////////////////////////////////////////////////////////////////////////////
static int sttCompareProtocols(const CDummyProto *p1, const CDummyProto *p2)
{
return mir_wstrcmp(p1->m_tszUserName, p2->m_tszUserName);
}
CDummyProto::CDummyProto(const char *szModuleName, const wchar_t *ptszUserName) :
PROTO(szModuleName, ptszUserName)
{
msgid = 0;
int id = getTemplateId();
ptrA setting(id > 0 ? mir_strdup(templates[id].setting) : getStringA(DUMMY_ID_SETTING));
if (setting != NULL) {
strncpy_s(uniqueIdText, setting, _TRUNCATE);
Proto_SetUniqueId(m_szModuleName, uniqueIdText);
}
else uniqueIdText[0] = '\0';
uniqueIdSetting[0] = '\0';
}
CDummyProto::~CDummyProto()
{
}
//////////////////////////////////////////////////////////////////////////////
int CDummyProto::getTemplateId()
{
int id = getByte(DUMMY_ID_TEMPLATE, -1);
if (id >= 0 && id < _countof(templates))
return id;
CMStringA szProto(getMStringA("AM_BaseProto"));
for (auto &it : templates)
if (!stricmp(it.name, szProto))
return int(&it - templates);
return 0;
}
void CDummyProto::selectTemplate(HWND hwndDlg, int templateId)
{
// Enable custom fields when selected custom template
EnableWindow(GetDlgItem(hwndDlg, IDC_ID_TEXT), templateId == 0);
EnableWindow(GetDlgItem(hwndDlg, IDC_ID_SETTING), templateId == 0);
ptrA tszIdText(templateId > 0 ? mir_strdup(Translate(templates[templateId].text)) : getStringA(DUMMY_ID_TEXT));
if (tszIdText != NULL)
SetDlgItemTextA(hwndDlg, IDC_ID_TEXT, tszIdText);
ptrA tszIdSetting(templateId > 0 ? mir_strdup(templates[templateId].setting) : getStringA(DUMMY_ID_SETTING));
if (tszIdSetting != NULL)
SetDlgItemTextA(hwndDlg, IDC_ID_SETTING, tszIdSetting);
}
INT_PTR CDummyProto::GetCaps(int type, MCONTACT)
{
switch(type) {
case PFLAGNUM_1:
return PF1_IM | PF1_BASICSEARCH | PF1_ADDSEARCHRES;
case PFLAGNUM_2:
return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT;
case PFLAGNUM_3:
return 0;
case PFLAGNUM_4:
return PF4_AVATARS | PF4_NOAUTHDENYREASON | PF4_NOCUSTOMAUTH;
case PFLAGNUM_5:
return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT;
case PFLAG_MAXLENOFMESSAGE:
return 0;
case PFLAG_UNIQUEIDTEXT:
if (uniqueIdSetting[0] == '\0') {
int id = getTemplateId();
ptrW setting(id > 0 ? mir_a2u(Translate(templates[id].text)) : getWStringA(DUMMY_ID_TEXT));
if (setting != NULL)
wcsncpy_s(uniqueIdSetting, setting, _TRUNCATE);
}
return (INT_PTR)uniqueIdSetting;
case 1000: // hidden caps
return TRUE;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
int CDummyProto::SendMsg(MCONTACT hContact, MEVENT, const char *msg)
{
std::string message = msg;
unsigned int id = InterlockedIncrement(&msgid);
if (getByte(DUMMY_KEY_ALLOW_SENDING, 0))
ProtoBroadcastAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)id);
else
ProtoBroadcastAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)id, (LPARAM)TranslateT("This Dummy account has disabled sending messages. Enable it in account options."));
return id;
}
int CDummyProto::SetStatus(int)
{
return 0;
}
HANDLE CDummyProto::SearchBasic(const wchar_t* id)
{
if (uniqueIdSetting[0] == '\0')
return nullptr;
wchar_t *tid = mir_wstrdup(id);
ForkThread(&CDummyProto::SearchIdAckThread, tid);
return tid;
}
MCONTACT CDummyProto::AddToList(int flags, PROTOSEARCHRESULT* psr)
{
if (psr->id.w == nullptr)
return NULL;
MCONTACT hContact = db_add_contact();
Proto_AddToContact(hContact, m_szModuleName);
if (flags & PALF_TEMPORARY) {
Contact::Hide(hContact);
Contact::RemoveFromList(hContact);
}
else if (!Contact::OnList(hContact)) {
Contact::Hide(hContact, false);
Contact::PutOnList(hContact);
}
setWString(hContact, _T2A(uniqueIdSetting), psr->id.w);
setWString(hContact, "Nick", psr->id.w);
return hContact;
}