/* Facebook plugin for Miranda Instant Messenger _____________________________________________ Copyright © 2011-13 Robert Pösel 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 "common.h" void FacebookProto::UpdateChat(const char *chat_id, const char *id, const char *name, const char *message, DWORD timestamp) { GCDEST gcd = { m_szModuleName }; gcd.ptszID = mir_a2t(chat_id); GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.ptszText = mir_a2t_cp(message,CP_UTF8); gce.time = timestamp ? timestamp : ::time(NULL); gce.dwFlags = GC_TCHAR; gcd.iType = GC_EVENT_MESSAGE; gce.bIsMe = !strcmp(id,facy.self_.user_id.c_str()); gce.dwFlags |= GCEF_ADDTOLOG; gce.ptszNick = mir_a2t_cp(name,CP_UTF8); gce.ptszUID = mir_a2t(id); CallServiceSync(MS_GC_EVENT,0,reinterpret_cast(&gce)); mir_free(const_cast(gce.ptszUID)); mir_free(const_cast(gce.ptszNick)); mir_free(const_cast(gce.ptszText)); mir_free(const_cast(gcd.ptszID)); } int FacebookProto::OnChatOutgoing(WPARAM wParam,LPARAM lParam) { GCHOOK *hook = reinterpret_cast(lParam); char *text; char *id; if (strcmp(hook->pDest->pszModule,m_szModuleName)) return 0; switch(hook->pDest->iType) { case GC_USER_MESSAGE: { text = mir_t2a_cp(hook->ptszText,CP_UTF8); std::string msg = text; id = mir_t2a_cp(hook->pDest->ptszID,CP_UTF8); std::string chat_id = id; mir_free(text); mir_free(id); if (isOnline()) { LOG("**Chat - Outgoing message: %s", text); ForkThread(&FacebookProto::SendChatMsgWorker, new send_chat(chat_id, msg)); } break; } case GC_USER_LEAVE: case GC_SESSION_TERMINATE: { break; } } return 0; } void FacebookProto::AddChatContact(const char *chat_id, const char *id, const char *name) { GCDEST gcd = { m_szModuleName }; gcd.ptszID = mir_a2t(chat_id); gcd.iType = GC_EVENT_JOIN; GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.dwFlags = GC_TCHAR | GCEF_ADDTOLOG; gce.ptszNick = mir_a2t_cp(name, CP_UTF8); gce.ptszUID = mir_a2t(id); gce.time = ::time(NULL); gce.bIsMe = !strcmp(id, facy.self_.user_id.c_str()); if (gce.bIsMe) gce.ptszStatus = _T("Admin"); else gce.ptszStatus = _T("Normal"); CallServiceSync(MS_GC_EVENT,0,reinterpret_cast(&gce)); mir_free(const_cast(gce.ptszNick)); mir_free(const_cast(gce.ptszUID)); mir_free(const_cast(gcd.ptszID)); } void FacebookProto::RemoveChatContact(const char *chat_id, const char *id) { // We dont want to remove our self-contact from chat. Ever. if (!strcmp(id, facy.self_.user_id.c_str())) return; GCDEST gcd = { m_szModuleName }; gcd.ptszID = mir_a2t(chat_id); gcd.iType = GC_EVENT_PART; GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.dwFlags = GC_TCHAR | GCEF_ADDTOLOG; //gce.ptszNick = mir_a2t_cp(name, CP_UTF8); gce.ptszUID = mir_a2t(id); gce.ptszNick = gce.ptszUID; gce.time = ::time(NULL); gce.bIsMe = false;//!strcmp(id, facy.self_.user_id.c_str()); CallServiceSync(MS_GC_EVENT,0,reinterpret_cast(&gce)); mir_free(const_cast(gcd.ptszID)); mir_free(const_cast(gce.ptszNick)); mir_free(const_cast(gce.ptszUID)); } char *FacebookProto::GetChatUsers(const char *chat_id) { GC_INFO gci = {0}; gci.Flags = USERS; gci.pszModule = m_szModuleName; gci.pszID = mir_a2t(chat_id); CallService(MS_GC_GETINFO, 0, (LPARAM)(GC_INFO *) &gci); LOG("**Chat - Users in chat %s: %s", chat_id, gci.pszUsers); mir_free(gci.pszID); // mir_free(gci.pszUsers); return gci.pszUsers; } bool FacebookProto::IsChatContact(const char *chat_id, const char *id) { char *users = GetChatUsers(chat_id); bool found = false; if (users != NULL && strstr(users, id) != NULL) found = true; mir_free(users); return found; } void FacebookProto::AddChat(const char *id, const char *name) { GCSESSION gcw = {sizeof(gcw)}; // Create the group chat session gcw.dwFlags = GC_TCHAR; gcw.iType = GCW_CHATROOM; gcw.pszModule = m_szModuleName; gcw.ptszName = mir_a2t_cp(name, CP_UTF8); gcw.ptszID = mir_a2t(id); CallServiceSync(MS_GC_NEWSESSION, 0, (LPARAM)&gcw); mir_free(const_cast(gcw.ptszName)); mir_free(const_cast(gcw.ptszID)); // Send setting events GCDEST gcd = { m_szModuleName }; gcd.ptszID = mir_a2t(id); GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.dwFlags = GC_TCHAR; // Create a user statuses gcd.iType = GC_EVENT_ADDGROUP; gce.ptszStatus = _T("Admin"); CallServiceSync(MS_GC_EVENT, NULL, reinterpret_cast(&gce)); gce.ptszStatus = _T("Normal"); CallServiceSync(MS_GC_EVENT, NULL, reinterpret_cast(&gce)); // Finish initialization gcd.iType = GC_EVENT_CONTROL; gce.time = ::time(NULL); gce.pDest = &gcd; // Add self contact AddChatContact(id, facy.self_.user_id.c_str(), facy.self_.real_name.c_str()); CallServiceSync(MS_GC_EVENT,SESSION_INITDONE,reinterpret_cast(&gce)); CallServiceSync(MS_GC_EVENT,SESSION_ONLINE, reinterpret_cast(&gce)); mir_free(const_cast(gcd.ptszID)); } /*void FacebookProto::SetTopic(const char *topic) { GCDEST gcd = { m_szModuleName }; gcd.ptszID = const_cast(m_tszUserName); gcd.iType = GC_EVENT_TOPIC; GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.dwFlags = GC_TCHAR; gce.time = ::time(NULL); std::string top = Translate(topic); gce.ptszText = mir_a2t(top.c_str()); CallServiceSync(MS_GC_EVENT,0, reinterpret_cast(&gce)); } */ INT_PTR FacebookProto::OnJoinChat(WPARAM,LPARAM suppress) { /* GCSESSION gcw = {sizeof(gcw)}; // Create the group chat session gcw.dwFlags = GC_TCHAR; gcw.iType = GCW_CHATROOM; gcw.pszModule = m_szModuleName; gcw.ptszName = m_tszUserName; gcw.ptszID = m_tszUserName; CallServiceSync(MS_GC_NEWSESSION, 0, (LPARAM)&gcw); if(m_iStatus != ID_STATUS_ONLINE) return 0; // Create a group GCDEST gcd = { m_szModuleName }; gcd.ptszID = const_cast(m_tszUserName); GCEVENT gce = {sizeof(gce)}; gce.pDest = &gcd; gce.dwFlags = GC_TCHAR; gcd.iType = GC_EVENT_ADDGROUP; gce.ptszStatus = _T("Admin"); CallServiceSync(MS_GC_EVENT, NULL, reinterpret_cast(&gce)); gce.ptszStatus = _T("Normal"); CallServiceSync(MS_GC_EVENT, NULL, reinterpret_cast(&gce)); SetTopic("Omegle is a great way of meeting new friends!"); // Note: Initialization will finish up in SetChatStatus, called separately if (!suppress) SetChatStatus(m_iStatus); */ return 0; } INT_PTR FacebookProto::OnLeaveChat(WPARAM,LPARAM) { GCDEST gcd = { m_szModuleName }; gcd.ptszID = NULL; gcd.iType = GC_EVENT_CONTROL; GCEVENT gce = {sizeof(gce)}; gce.dwFlags = GC_TCHAR; gce.time = ::time(NULL); gce.pDest = &gcd; CallServiceSync(MS_GC_EVENT,SESSION_OFFLINE, reinterpret_cast(&gce)); CallServiceSync(MS_GC_EVENT,SESSION_TERMINATE,reinterpret_cast(&gce)); return 0; } /* void FacebookProto::SetChatStatus(int status) { GCDEST gcd = { m_szModuleName }; gcd.ptszID = const_cast(m_tszUserName); gcd.iType = GC_EVENT_CONTROL; GCEVENT gce = {sizeof(gce)}; gce.dwFlags = GC_TCHAR; gce.time = ::time(NULL); gce.pDest = &gcd; if(status == ID_STATUS_ONLINE) { // Add self contact AddChatContact(facy.nick_.c_str()); CallServiceSync(MS_GC_EVENT,SESSION_INITDONE,reinterpret_cast(&gce)); CallServiceSync(MS_GC_EVENT,SESSION_ONLINE, reinterpret_cast(&gce)); } else { CallServiceSync(MS_GC_EVENT,SESSION_OFFLINE,reinterpret_cast(&gce)); } } */