/*
Minecraft Dynmap plugin for Miranda Instant Messenger
_____________________________________________
Copyright © 2015-17 Robert Pösel, 2017-23 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, either version 2 of the License, or
(at your option) any later version.
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"
void MinecraftDynmapProto::UpdateChat(const char *name, const char *message, const time_t timestamp, bool addtolog)
{
// replace % to %% to not interfere with chat color codes
CMStringA szMessage(message);
szMessage.Replace("%", "%%");
GCEVENT gce = {m_si, GC_EVENT_MESSAGE };
gce.dwFlags = GCEF_UTF8;
gce.time = timestamp;
gce.pszText.a = szMessage.c_str();
if (name == NULL) {
gce.iType = GC_EVENT_INFORMATION;
name = TranslateU("Server");
gce.bIsMe = false;
}
else gce.bIsMe = (m_nick == name);
if (addtolog)
gce.dwFlags |= GCEF_ADDTOLOG;
gce.pszUID.a = gce.pszNick.a = name;
Chat_Event(&gce);
}
int MinecraftDynmapProto::OnChatEvent(WPARAM, LPARAM lParam)
{
GCHOOK *hook = reinterpret_cast(lParam);
if(strcmp(hook->si->pszModule,m_szModuleName))
return 0;
switch(hook->iType) {
case GC_USER_MESSAGE:
{
CMStringA szText(ptrA(mir_utf8encodeW(hook->ptszText)));
szText.Replace("%%", "%");
if (szText.IsEmpty())
break;
// Outgoing message
debugLogA("**Chat - Outgoing message: %s", szText.c_str());
ForkThread(&MinecraftDynmapProto::SendMsgWorker, new std::string(szText));
}
break;
case GC_SESSION_TERMINATE:
m_nick.clear();
SetStatus(ID_STATUS_OFFLINE);
break;
}
return 0;
}
void MinecraftDynmapProto::AddChatContact(const char *name)
{
GCEVENT gce = {m_si, GC_EVENT_JOIN };
gce.time = uint32_t(time(0));
gce.dwFlags = GCEF_UTF8 + GCEF_ADDTOLOG;
gce.pszUID.a = gce.pszNick.a = name;
gce.bIsMe = (m_nick == name);
if (gce.bIsMe)
gce.pszStatus.a = "Admin";
else
gce.pszStatus.a = "Normal";
Chat_Event(&gce);
}
void MinecraftDynmapProto::DeleteChatContact(const char *name)
{
GCEVENT gce = {m_si, GC_EVENT_PART };
gce.dwFlags = GCEF_UTF8 + GCEF_ADDTOLOG;
gce.pszUID.a = gce.pszNick.a = name;
gce.time = uint32_t(time(0));
gce.bIsMe = (m_nick == name);
Chat_Event(&gce);
}
INT_PTR MinecraftDynmapProto::OnJoinChat(WPARAM,LPARAM suppress)
{
ptrW tszTitle(mir_a2u_cp(m_title.c_str(), CP_UTF8));
// Create the group chat session
m_si = Chat_NewSession(GCW_PRIVMESS, m_szModuleName, m_tszUserName, tszTitle);
if (!m_si || m_iStatus == ID_STATUS_OFFLINE)
return 0;
// Create a group
Chat_AddGroup(m_si, TranslateT("Admin"));
Chat_AddGroup(m_si, TranslateT("Normal"));
// Note: Initialization will finish up in SetChatStatus, called separately
if (!suppress)
SetChatStatus(m_iStatus);
return 0;
}
void MinecraftDynmapProto::SetTopic(const char *topic)
{
GCEVENT gce = {m_si, GC_EVENT_TOPIC };
gce.dwFlags = GCEF_UTF8;
gce.time = ::time(0);
gce.pszText.a = topic;
Chat_Event( &gce);
}
INT_PTR MinecraftDynmapProto::OnLeaveChat(WPARAM,LPARAM)
{
Chat_Control(m_si, SESSION_OFFLINE);
Chat_Terminate(m_si);
m_si = nullptr;
return 0;
}
void MinecraftDynmapProto::SetChatStatus(int status)
{
if (status == ID_STATUS_ONLINE)
{
// Load actual name from database
ptrA nick(db_get_sa(0, m_szModuleName, MINECRAFTDYNMAP_KEY_NAME, Translate("You")));
m_nick = nick;
// Add self contact
AddChatContact(m_nick.c_str());
Chat_Control(m_si, SESSION_INITDONE);
Chat_Control(m_si, SESSION_ONLINE);
}
else Chat_Control(m_si, SESSION_OFFLINE);
}
void MinecraftDynmapProto::ClearChat()
{
Chat_Control(m_si, WINDOW_CLEARLOG);
}
// TODO: Could this be done better?
MCONTACT MinecraftDynmapProto::GetChatHandle()
{
GC_INFO gci = {0};
gci.Flags = GCF_HCONTACT;
gci.pszModule = m_szModuleName;
gci.pszID = m_tszUserName;
Chat_GetInfo(&gci);
return gci.hContact;
}