/* Copyright © 2012-19 Miranda NG team Copyright © 2009 Jim Porter 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" #include "proto.h" #include #include void TwitterProto::UpdateChat(const twitter_user &update) { GCEVENT gce = { m_szModuleName, m_szChatId, GC_EVENT_MESSAGE }; gce.dwFlags = GCEF_UTF8 + GCEF_ADDTOLOG; gce.bIsMe = (update.username == twit_.get_username()); gce.pszUID.a = update.username.c_str(); //TODO: write code here to replace % with %% in update.status.text (which is a std::string) std::string chatText = update.status.text; replaceAll(chatText, "%", "%%"); gce.pszText.a = chatText.c_str(); gce.time = static_cast(update.status.time); MCONTACT hContact = UsernameToHContact(update.username.c_str()); CMStringA szNick = db_get_sm(hContact, "CList", "MyHandle"); if (hContact && !szNick.IsEmpty()) gce.pszNick.a = szNick; else gce.pszNick.a = update.username.c_str(); Chat_Event(&gce); mir_free(const_cast(gce.pszNick.w)); mir_free(const_cast(gce.pszUID.w)); mir_free(const_cast(gce.pszText.w)); } int TwitterProto::OnChatOutgoing(WPARAM, LPARAM lParam) { GCHOOK *hook = reinterpret_cast(lParam); if (mir_strcmp(hook->pszModule, m_szModuleName)) return 0; switch (hook->iType) { case GC_USER_MESSAGE: debugLogW(L"**Chat - Outgoing message: %s", hook->ptszText); { T2Utf text(hook->ptszText); std::string tweet(text); replaceAll(tweet, "%%", "%"); // the chat plugin will turn "%" into "%%", so we have to change it back :/ char *varTweet = mir_strdup(tweet.c_str()); ForkThread(&TwitterProto::SendTweetWorker, varTweet); } break; case GC_USER_PRIVMESS: { ptrA text(mir_u2a(hook->ptszUID)); CallService(MS_MSG_SENDMESSAGE, WPARAM(UsernameToHContact(text)), 0); } break; } return 0; } // TODO: remove nick? void TwitterProto::AddChatContact(const char *name, const char *nick) { GCEVENT gce = { m_szModuleName, m_szChatId, GC_EVENT_JOIN }; gce.dwFlags = GCEF_UTF8; gce.time = DWORD(time(0)); gce.pszNick.a = nick ? nick : name; gce.pszUID.a = name; gce.pszStatus.a = "Normal"; Chat_Event(&gce); } void TwitterProto::DeleteChatContact(const char *name) { GCEVENT gce = { m_szModuleName, m_szChatId, GC_EVENT_PART }; gce.dwFlags = GCEF_UTF8; gce.time = DWORD(time(0)); gce.pszUID.a = gce.pszNick.a = name; Chat_Event(&gce); } INT_PTR TwitterProto::OnJoinChat(WPARAM, LPARAM suppress) { // ***** Create the group chat session SESSION_INFO *si = Chat_NewSession(GCW_CHATROOM, m_szModuleName, m_tszUserName, m_tszUserName); if (!si || m_iStatus != ID_STATUS_ONLINE) return 0; // ***** Create a group Chat_AddGroup(si, TranslateT("Normal")); // ***** Hook events HookProtoEvent(ME_GC_EVENT, &TwitterProto::OnChatOutgoing); // Note: Initialization will finish up in SetChatStatus, called separately if (!suppress) SetChatStatus(m_iStatus); in_chat_ = true; return 0; } INT_PTR TwitterProto::OnLeaveChat(WPARAM, LPARAM) { in_chat_ = false; Chat_Control(m_szModuleName, m_tszUserName, SESSION_OFFLINE); Chat_Terminate(m_szModuleName, m_tszUserName); return 0; } void TwitterProto::SetChatStatus(int status) { if (status == ID_STATUS_ONLINE) { // Add all friends to contact list for (auto &hContact : AccContacts()) { if (isChatRoom(hContact)) continue; DBVARIANT uid, nick; if (getString(hContact, TWITTER_KEY_UN, &uid)) continue; if (!db_get_s(hContact, "CList", "MyHandle", &nick)) { AddChatContact(uid.pszVal, nick.pszVal); db_free(&nick); } else AddChatContact(uid.pszVal); db_free(&uid); } // For some reason, I have to send an INITDONE message, even if I'm not actually // initializing the room... Chat_Control(m_szModuleName, m_tszUserName, SESSION_INITDONE); Chat_Control(m_szModuleName, m_tszUserName, SESSION_ONLINE); } else Chat_Control(m_szModuleName, m_tszUserName, SESSION_OFFLINE); }