summaryrefslogtreecommitdiff
path: root/tools/_deprecated/Yahoo/src/im.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/_deprecated/Yahoo/src/im.cpp')
-rw-r--r--tools/_deprecated/Yahoo/src/im.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/tools/_deprecated/Yahoo/src/im.cpp b/tools/_deprecated/Yahoo/src/im.cpp
new file mode 100644
index 0000000000..398dfda62a
--- /dev/null
+++ b/tools/_deprecated/Yahoo/src/im.cpp
@@ -0,0 +1,239 @@
+/*
+ * $Id: im.cpp 12307 2010-08-11 21:49:46Z Michael.Kunz@s2005.TU-Chemnitz.de $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "stdafx.h"
+#include <m_langpack.h>
+#include <m_protosvc.h>
+
+#include "avatar.h"
+#include "im.h"
+#include "ignore.h"
+
+void CYahooProto::send_msg(const char *id, int protocol, const char *msg, int utf8)
+{
+ LOG(("[send_msg] Who: %s: protocol: %d Msg: '%s', utf: %d", id, protocol, msg, utf8));
+
+ int buddy_icon = (getDword("AvatarHash", 0) != 0) ? 2 : 0;
+ yahoo_send_im(m_id, NULL, id, protocol, msg, utf8, buddy_icon);
+}
+
+void CYahooProto::ext_got_im(const char *me, const char *who, int protocol, const char *msg,
+ long tm, int stat, int utf8, int buddy_icon,
+ const char *seqn, int sendn)
+{
+ char *umsg;
+ const char *c = msg;
+ int oidx = 0;
+
+ LOG(("YAHOO_GOT_IM id:%s %s: %s (len: %d) tm:%lu stat:%i utf8:%i buddy_icon: %i", me, who, msg, mir_strlen(msg), tm, stat, utf8, buddy_icon));
+
+ if (stat == 2) {
+ char z[1024];
+
+ mir_snprintf(z, "Error sending message to %s", who);
+ LOG((z));
+ ShowError(TranslateT("Yahoo Error"), _A2T(z));
+ return;
+ }
+
+ if (!msg) {
+ LOG(("Empty Incoming Message, exiting."));
+ return;
+ }
+
+ if (getByte("IgnoreUnknown", 0)) {
+
+ /*
+ * Check our buddy list to see if we have it there. And if it's not on the list then we don't accept any IMs.
+ */
+ if (getbuddyH(who) == NULL) {
+ LOG(("Ignoring unknown user messages. User '%s'. Dropping Message.", who));
+ return;
+ }
+ }
+
+ if (BuddyIgnored(who)) {
+ LOG(("User '%s' on our Ignore List. Dropping Message.", who));
+ return;
+ }
+
+ // make a bigger buffer for \n -> \r\n conversion (x2)
+ umsg = (char *)alloca(mir_strlen(msg) * 2 + 1);
+
+ while (*c != '\0') {
+ // Strip the font tag
+ if (!_strnicmp(c, "<font ", 6) || !_strnicmp(c, "</font>", 6) ||
+ // strip the fade tag
+ !_strnicmp(c, "<FADE ", 6) || !_strnicmp(c, "</FADE>", 7) ||
+ // strip the alternate colors tag
+ !_strnicmp(c, "<ALT ", 5) || !_strnicmp(c, "</ALT>", 6)) {
+ while ((*c++ != '>') && (*c != '\0'));
+ }
+ else
+ // strip ANSI color combination
+ if ((*c == 0x1b) && (*(c + 1) == '[')) {
+ while ((*c++ != 'm') && (*c != '\0'));
+ }
+ else
+
+ if (*c != '\0') {
+ umsg[oidx++] = *c;
+
+ /* Adding \r to \r\n conversion */
+ if (*c == '\r' && *(c + 1) != '\n')
+ umsg[oidx++] = '\n';
+
+ c++;
+ }
+ }
+
+ umsg[oidx++] = '\0';
+
+ /* Need to strip off formatting stuff first. Then do all decoding/converting */
+ LOG(("%s: %s", who, umsg));
+
+ MCONTACT hContact = add_buddy(who, who, protocol, PALF_TEMPORARY);
+ //setWord(hContact, "yprotoid", protocol);
+ Set_Protocol(hContact, protocol);
+
+ PROTORECVEVENT pre = { 0 };
+ if (tm) {
+ MEVENT hEvent = db_event_last(hContact);
+
+ if (hEvent) { // contact has events
+ DWORD dummy;
+ DBEVENTINFO dbei = { sizeof(dbei) };
+ dbei.pBlob = (BYTE*)&dummy;
+ dbei.cbBlob = 2;
+ if (!db_event_get(hEvent, &dbei))
+ // got that event, if newer than ts then reset to current time
+ if ((DWORD)tm < dbei.timestamp) tm = (long)time(NULL);
+ }
+
+ pre.timestamp = (DWORD)time(NULL);
+
+ if ((DWORD)tm < pre.timestamp)
+ pre.timestamp = tm;
+
+ }
+ else pre.timestamp = (DWORD)time(NULL);
+
+ pre.szMessage = umsg;
+ pre.lParam = 0;
+
+ // Turn off typing
+ CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF);
+ ProtoChainRecvMsg(hContact, &pre);
+
+ // ack the message we just got
+ if (seqn)
+ yahoo_send_im_ack(m_id, me, who, seqn, sendn);
+
+ if (buddy_icon < 0) return;
+
+ //?? Don't generate floods!!
+ setByte(hContact, "AvatarType", (BYTE)buddy_icon);
+ if (buddy_icon != 2)
+ reset_avatar(hContact);
+ else if (getDword(hContact, "PictCK", 0) == 0) /* request the buddy image */
+ request_avatar(who);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SendMessage - sends a message
+
+void __cdecl CYahooProto::im_sendacksuccess(void *hContact)
+{
+ ProtoBroadcastAck((MCONTACT)hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+}
+
+void __cdecl CYahooProto::im_sendackfail(void *hContact)
+{
+ SleepEx(1000, TRUE);
+ ProtoBroadcastAck((MCONTACT)hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)1,
+ (LPARAM)Translate("The message send timed out."));
+}
+
+void __cdecl CYahooProto::im_sendackfail_longmsg(void *hContact)
+{
+ SleepEx(1000, TRUE);
+ ProtoBroadcastAck((MCONTACT)hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)1,
+ (LPARAM)Translate("Message is too long: Yahoo messages are limited by 800 UTF8 chars"));
+}
+
+int __cdecl CYahooProto::SendMsg(MCONTACT hContact, int, const char* pszSrc)
+{
+ if (!m_bLoggedIn) {/* don't send message if we not connected! */
+ ForkThread(&CYahooProto::im_sendackfail, (void*)hContact);
+ return 1;
+ }
+
+ if (mir_strlen(pszSrc) > 800) {
+ ForkThread(&CYahooProto::im_sendackfail_longmsg, (void*)hContact);
+ return 1;
+ }
+
+ DBVARIANT dbv;
+ if (!getString(hContact, YAHOO_LOGINID, &dbv)) {
+ send_msg(dbv.pszVal, getWord(hContact, "yprotoid", 0), pszSrc, 1);
+
+ ForkThread(&CYahooProto::im_sendacksuccess, (void*)hContact);
+
+ db_free(&dbv);
+ return 1;
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvMsg
+
+int __cdecl CYahooProto::RecvMsg(MCONTACT hContact, PROTORECVEVENT* pre)
+{
+ db_unset(hContact, "CList", "Hidden");
+
+ // NUDGES
+ if (!mir_strcmp(pre->szMessage, "<ding>") && ServiceExists("NUDGE/Send")) {
+ debugLogA("[YahooRecvMessage] Doing Nudge Service!");
+ NotifyEventHooks(hYahooNudge, hContact, pre->timestamp);
+ return 0;
+ }
+
+ return Proto_RecvMessage(hContact, pre);
+}
+
+//=======================================================
+// Send a nudge
+//=======================================================
+
+INT_PTR __cdecl CYahooProto::SendNudge(WPARAM hContact, LPARAM)
+{
+ debugLogA("[YAHOO_SENDNUDGE]");
+
+ if (!m_bLoggedIn) {/* don't send nudge if we not connected! */
+ ForkThread(&CYahooProto::im_sendackfail, (void*)hContact);
+ return 1;
+ }
+
+ DBVARIANT dbv;
+ if (!getString(hContact, YAHOO_LOGINID, &dbv)) {
+ send_msg(dbv.pszVal, getWord(hContact, "yprotoid", 0), "<ding>", 0);
+ db_free(&dbv);
+
+ ForkThread(&CYahooProto::im_sendacksuccess, (void*)hContact);
+ return 1;
+ }
+
+ return 0;
+}