MCONTACT CIrcProto::CList_AddContact(CONTACT *user, bool InList, bool SetOnline) { if (user->name == NULL) return 0; MCONTACT hContact = CList_FindContact(user); if (hContact) { if (InList) db_unset(hContact, "CList", "NotOnList"); setTString(hContact, "Nick", user->name); db_unset(hContact, "CList", "Hidden"); if (SetOnline && getWord(hContact, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) setWord(hContact, "Status", ID_STATUS_ONLINE); return hContact; } // here we create a new one since no one is to be found hContact = (MCONTACT)CallService(MS_DB_CONTACT_ADD, 0, 0); if (hContact) { CallService(MS_PROTO_ADDTOCONTACT, hContact, (LPARAM)m_szModuleName); if (InList) db_unset(hContact, "CList", "NotOnList"); else db_set_b(hContact, "CList", "NotOnList", 1); db_unset(hContact, "CList", "Hidden"); setTString(hContact, "Nick", user->name); setTString(hContact, "Default", user->name); setWord(hContact, "Status", SetOnline ? ID_STATUS_ONLINE : ID_STATUS_OFFLINE); if (!InList && getByte("MirVerAutoRequestTemp", 0)) PostIrcMessage(_T("/PRIVMSG %s \001VERSION\001"), user->name); return hContact; } return false; }
BOOL CIrcProto::CList_AddDCCChat(const CMString& name, const CMString& hostmask, unsigned long adr, int port) { MCONTACT hContact; TCHAR szNick[256]; char szService[256]; bool bFlag = false; CONTACT usertemp = { (TCHAR*)name.c_str(), NULL, NULL, false, false, true }; MCONTACT hc = CList_FindContact(&usertemp); if (hc && db_get_b(hc, "CList", "NotOnList", 0) == 0 && db_get_b(hc, "CList", "Hidden", 0) == 0) bFlag = true; CMString contactname = name; contactname += DCCSTRING; CONTACT user = { (TCHAR*)contactname.c_str(), NULL, NULL, false, false, true }; hContact = CList_AddContact(&user, false, false); setByte(hContact, "DCC", 1); DCCINFO* pdci = new DCCINFO; pdci->sHostmask = hostmask; pdci->hContact = hContact; pdci->dwAdr = (DWORD)adr; pdci->iPort = port; pdci->iType = DCC_CHAT; pdci->bSender = false; pdci->sContactName = name; if (m_DCCChatAccept == 3 || m_DCCChatAccept == 2 && bFlag) { CDccSession* dcc = new CDccSession(this, pdci); CDccSession* olddcc = FindDCCSession(hContact); if (olddcc) olddcc->Disconnect(); AddDCCSession(hContact, dcc); dcc->Connect(); if (getByte("MirVerAutoRequest", 1)) PostIrcMessage(_T("/PRIVMSG %s \001VERSION\001"), name.c_str()); } else { CLISTEVENT cle = { sizeof(cle) }; cle.hContact = hContact; cle.hDbEvent = (HANDLE)"dccchat"; cle.flags = CLEF_TCHAR; cle.hIcon = LoadIconEx(IDI_DCC); mir_snprintf(szService, sizeof(szService), "%s/DblClickEvent", m_szModuleName); cle.pszService = szService; mir_sntprintf(szNick, SIZEOF(szNick), TranslateT("CTCP chat request from %s"), name.c_str()); cle.ptszTooltip = szNick; cle.lParam = (LPARAM)pdci; if (CallService(MS_CLIST_GETEVENT, hContact, 0)) CallService(MS_CLIST_REMOVEEVENT, hContact, (LPARAM)"dccchat"); CallService(MS_CLIST_ADDEVENT, hContact, (LPARAM)&cle); } return TRUE; }
HANDLE CIrcProto::CList_SetOffline(struct CONTACT * user) { DBVARIANT dbv; HANDLE hContact = CList_FindContact(user); if ( hContact ) { if ( !getTString( hContact, "Default", &dbv )) { setString(hContact, "User", ""); setString(hContact, "Host", ""); setTString(hContact, "Nick", dbv.ptszVal); setWord(hContact, "Status", ID_STATUS_OFFLINE); db_free(&dbv); return hContact; } } return 0; }