Code:
/*
Linked Chats
Copyright: Choli - 2006
You are not allowed to modify the code of this file, nor use it in your programs.
You can, however, learn from it and use the techniques used here in your own programs.
You must not distribute the file as is. You can (and are encouraged to) share with
anyone the original, un-modified Plus Live Script Pack file.
Enjoy the program!
Author:
_________ .__ .__ .__
\_ ___ \ | |__ ____ | | |__|
/ \ \/ | | \ / _ \ | | | |
\ \____| Y \( <_> )| |__| |
\______ /|___| / \____/ |____/|__|
\/ \/
Choli.
*/
var INTERNAL_VER = "1.0 - Beta";
var MENULOCATION_CONTACTLIST = 1;
var MENULOCATION_CHATWND = 2;
var AW_HIDE = 0x10000;
var AW_BLEND = 0x80000;
var WM_SETICON = 0x80;
var ICON_BIG = 1;
var ICON_SMALL = 0;
var MB_OK = 0;
var MB_ICONWARNING = 0x30;
var MB_ICONINFORMATION = 0x40;
var EV_OTHER = 0;
var EV_MSG_SENT = 1;
var EV_MSG_RECEIVED = 2;
var EV_CONTACT_ADDED = 3;
var EV_CONTACT_REMOVED = 4;
var EV_CHAT_CLOSED = 5;
var EV_SUB_OTHER = 0;
var MESSAGEKIND_UNKNOWN = 0;
var MESSAGEKIND_SAYS = 1;
var MESSAGEKIND_WINKS = 2;
var MESSAGEKIND_VOICECLIPS = 3;
var MESSAGEKIND_SEARCHING = 4;
var MESSAGEKIND_FIND = 5;
var MESSAGEKIND_SAYSOFFLINE = 6;
var STATUS_UNKNOWN = 0;
var STATUS_OFFLINE = 1;
var STATUS_APPEAROFFLINE = 2;
var STATUS_ONLINE = 3;
var STATUS_BUSY = 4;
var STATUS_BRB = 5;
var STATUS_IDLE = 6;
var STATUS_AWAY = 7;
var STATUS_ONPHONE = 8;
var STATUS_OUTLUNCH = 9;
var GlobalData;
var PreparedForLinking;
var img_counter;
var AUX_Wnd;
var AUX_Lst;
var AUX_Sta;
/****************************************************************************
*
* Events
*
****************************************************************************/
/*******************************************************
*
* Global events
*
*******************************************************/
function OnEvent_Initialize (bMessengerStart) {
GlobalData = new Array();
PreparedForLinking = new Array();
img_counter = 0;
AUX_Wnd = null;
}
function OnGetScriptMenu (nLocation) {
var menu;
switch(nLocation) {
case MENULOCATION_CHATWND:
menu = "<ScriptMenu>";
menu += "<MenuEntry Id=\"StartLink\">Link this chat</MenuEntry>";
menu += "</ScriptMenu>";
break;
case MENULOCATION_CONTACTLIST:
menu = "";
break;
default:
menu = "";
break;
}
return menu;
}
function OnGetScriptCommands () {
var commands;
commands = "<ScriptCommands>";
commands += "<Command>";
commands += "<Name>link</Name>";
commands += "<Description>Links this chat to another</Description>";
commands += "</Command>";
commands += "</ScriptCommands>";
return commands;
}
function OnEvent_Timer (TimerId) {
var function_handler = TimerId + "_timer";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "();");
}
}
function OnEvent_MenuClicked (sMenuId, nLocation, iOriginWnd) {
var function_handler = sMenuId + "_menuclicked";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(nLocation, iOriginWnd);");
}
}
/*******************************************************
*
* Events of LinkedChats window
*
*******************************************************/
function OnLinkedChatsEvent_CtrlClicked (Wnd, sControlId) {
var function_handler = sControlId + "_onclick";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(Wnd);");
}
}
function OnLinkedChatsEvent_LstViewClicked (pPlusWnd, sControlId, nItemIdx) {
var function_handler = sControlId + "_clicked";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(pPlusWnd, nItemIdx);");
}
}
function OnLinkedChatsEvent_LstViewRClicked (pPlusWnd, sControlId, nItemIdx) {
var function_handler = sControlId + "_rclicked";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(pPlusWnd, nItemIdx);");
}
}
function OnLinkedChatsEvent_LstViewDblClicked (pPlusWnd, sControlId, nItemIdx) {
var function_handler = sControlId + "_dblclicked";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(pPlusWnd, nItemIdx);");
}
}
function OnLinkedChatsEvent_Cancel (pPlusWnd) {
var bIgnoreCancel = false;
var i;
var a1;
var a2;
Interop.Call("user32.dll", "AnimateWindow", pPlusWnd.Handle, 650, AW_HIDE | AW_BLEND);
for (i = 0; i < PreparedForLinking.length; i++) {
if (PreparedForLinking[i].PrepLinkWnd == pPlusWnd) {
a1 = PreparedForLinking.slice(0, i);
a2 = PreparedForLinking.slice(i + 1);
PreparedForLinking = a1.concat(a2);
break;
}
}
return bIgnoreCancel;
}
/*******************************************************
*
* Events of ActiveLinking window
*
*******************************************************/
function OnActiveLinkingEvent_CtrlClicked (Wnd, sControlId) {
var function_handler = sControlId + "_onclick_active";
if (eval("typeof(" + function_handler + ")") == "function") {
eval(function_handler + "(Wnd);");
}
}
function OnActiveLinkingEvent_Cancel (pPlusWnd) {
var bIgnoreCancel = false;
var i;
var a1;
var a2;
Interop.Call("user32.dll", "AnimateWindow", pPlusWnd.Handle, 650, AW_HIDE | AW_BLEND);
for (i = 0; i < GlobalData.length; i++) {
if (GlobalData[i].LinkWnd == pPlusWnd) {
a1 = GlobalData.slice(0, i);
a2 = GlobalData.slice(i + 1);
GlobalData = a1.concat(a2);
break;
}
}
return bIgnoreCancel;
}
/*******************************************************
*
* Chat events
*
*******************************************************/
function OnEvent_ChatWndSendMessage (pChatWnd, sMessage) {
if (sMessage == "/link" || sMessage.indexOf("/link ") == 0) {
link_from(pChatWnd);
return "";
} else {
link_event(pChatWnd, Messenger.MyName, sMessage, EV_MSG_SENT, EV_SUB_OTHER);
return sMessage;
}
}
function OnEvent_ChatWndReceiveMessage (pChatWnd, sOrigin, sMessage, nMessageKind) {
if (sOrigin != Messenger.MyName) {
link_event(pChatWnd, sOrigin, sMessage, EV_MSG_RECEIVED, nMessageKind);
}
return sMessage;
}
function OnEvent_ChatWndContactAdded (pChatWnd, sEmail) {
link_event(pChatWnd, sEmail, "", EV_CONTACT_ADDED, EV_SUB_OTHER);
}
function OnEvent_ChatWndContactRemoved (pChatWnd, sEmail) {
link_event(pChatWnd, sEmail, "", EV_CONTACT_REMOVED, EV_SUB_OTHER);
}
function OnEvent_ChatWndDestroyed (pChatWnd) {
var i;
var n;
var a1 = new Array();
var some_deleted = false;
link_event(pChatWnd, "", "", EV_CHAT_CLOSED, EV_SUB_OTHER);
n = PreparedForLinking.length;
for (i = 0; i < n; i++) {
if (PreparedForLinking[i].ChatWndOrg == pChatWnd) {
PreparedForLinking[i].PrepLinkWnd.Close(0);
some_deleted = true;
} else {
a1.push(PreparedForLinking[i])
}
}
if (some_deleted) {
PreparedForLinking = a1;
}
}
/****************************************************************************
*
* Handlers
*
****************************************************************************/
/*******************************************************
*
* Timers
*
*******************************************************/
function Count_checked_items_timer () {
var n = AUX_Wnd.LstView_GetCount(AUX_Lst);
var c = 0;
var i;
for (i = 0; i < n; i++) {
if (AUX_Wnd.LstView_GetCheckedState(AUX_Lst, i)) {
c++;
}
}
AUX_Wnd.SetControlText(AUX_Sta, c + " contact" + (c != 1 ? "s" : ""));
AUX_Wnd = null;
}
function Animation_timer () {
var i;
for (i = 0; i < GlobalData.length; i++) {
if (!GlobalData[i].LinkWnd.Button_IsChecked("CHKPauseLnk")) {
GlobalData[i].LinkWnd.ImageElmt_SetImageFile("IMG3", "s" + img_counter + ".png");
}
}
if (GlobalData.length > 0) {
img_counter = (img_counter + 9) % 32;
MsgPlus.AddTimer("Animation", 350);
}
}
/*******************************************************
*
* Menus
*
*******************************************************/
function StartLink_menuclicked (nLocation, iOriginWnd) {
switch(nLocation) {
case MENULOCATION_CHATWND:
link_from(iOriginWnd);
break;
case MENULOCATION_CONTACTLIST:
break;
default:
break;
}
}
/*******************************************************
*
* Controls of LinkedChats window
*
*******************************************************/
function BTNAbout_onclick (Wnd) {
var myfolder;
var hicon;
myfolder = MsgPlus.ScriptFilesPath;
hicon = Interop.Call("shell32.dll", "ExtractIconW", Wnd.Handle, myfolder + "\\Linked Chats.ico", 0);
Interop.Call("shell32.dll", "ShellAboutW", Wnd.Handle, "Linked Chats - " + INTERNAL_VER + "#Choli", "Enjoy it!", hicon);
Interop.Call("user32.dll", "DestroyIcon", hicon);
}
function BTNLink_onclick (Wnd) {
var n;
var i;
var emails = new Array();
var convo = null;
var link_wnd;
var ChatWndOrg = null;
var a1;
var a2;
var myfolder;
n = Wnd.LstView_GetCount("LSTContacts_dst");
for (i = 0; i < n; i++) {
if (Wnd.LstView_GetCheckedState("LSTContacts_dst", i)) {
var email = Wnd.LstView_GetItemText("LSTContacts_dst", i, 2);
emails.push(email);
}
}
if (emails.length == 0) {
Interop.Call("user32.dll", "MessageBoxW", Wnd.Handle, "You have to select at least one destination contact.", "Linked chats", MB_OK | MB_ICONWARNING);
return;
}
for (i = 0; i < PreparedForLinking.length; i++) {
if (PreparedForLinking[i].PrepLinkWnd == Wnd) {
ChatWndOrg = PreparedForLinking[i].ChatWndOrg;
a1 = PreparedForLinking.slice(0, i);
a2 = PreparedForLinking.slice(i + 1);
PreparedForLinking = a1.concat(a2);
break;
}
}
if (ChatWndOrg == null) {
Wnd.Close(0);
Debug.Trace("Internal error. No source chat window.");
return;
}
n = emails.length;
for (i = 0; i < n; i++) {
var contact;
email = emails[i];
contact = Messenger.MyContacts.GetContact(email);
if (i == 0) {
convo = Messenger.OpenChat(contact);
} else {
convo.SendMessage("/invite " + email);
}
}
link_wnd = MsgPlus.CreateWnd("Linked Chats.xml", "ActiveLinking");
myfolder = MsgPlus.ScriptFilesPath;
hicon = Interop.Call("shell32.dll", "ExtractIconW", link_wnd.Handle, myfolder + "\\Linked Chats.ico", 0);
Interop.Call("user32.dll", "SendMessageW", link_wnd.Handle, WM_SETICON, ICON_BIG, hicon);
Interop.Call("user32.dll", "SendMessageW", link_wnd.Handle, WM_SETICON, ICON_SMALL, hicon);
link_wnd.Button_SetCheckState("CHKMsgSent", true);
link_wnd.Button_SetCheckState("CHKMsgRec", true);
link_wnd.Button_SetCheckState("CHKOther", true);
GlobalData.push({ChatWndOrg : ChatWndOrg, ChatWndDst : convo, LinkWnd : link_wnd});
MsgPlus.AddTimer("Animation", 350);
Wnd.Close(0);
}
function LSTContacts_dst_clicked (Wnd, Item) {
AUX_Wnd = Wnd;
AUX_Lst = "LSTContacts_dst";
AUX_Sta = "STADstCount";
MsgPlus.AddTimer("Count_checked_items", 100);
}
function LSTContacts_dst_rclicked (Wnd, Item) {
return LSTContacts_dst_clicked(Wnd, Item);
}
function LSTContacts_dst_dblclicked (Wnd, Item) {
return LSTContacts_dst_clicked(Wnd, Item);
}
/*******************************************************
*
* Controls of ActiveLinking window
*
*******************************************************/
function BTNActiveInfo_onclick_active (Wnd) {
var i;
var string;
var contacts;
var contact;
string = "Source contacts:\n";
for (i = 0; i < GlobalData.length; i++) {
if (GlobalData[i].LinkWnd == Wnd) {
contacts = GlobalData[i].ChatWndOrg.Contacts;
contact = new Enumerator(contacts);
for (; !contact.atEnd(); contact.moveNext()) {
var nick;
var email;
nick = MsgPlus.RemoveFormatCodes(contact.item().Name);
email = contact.item().Email;
string += "\n" + nick + " (" + email + ")";
}
string += "\n\n\nDestination contacts:\n"
contacts = GlobalData[i].ChatWndDst.Contacts;
contact = new Enumerator(contacts);
for (; !contact.atEnd(); contact.moveNext()) {
var nick;
var email;
nick = MsgPlus.RemoveFormatCodes(contact.item().Name);
email = contact.item().Email;
string += "\n" + nick + " (" + email + ")";
}
Interop.Call("user32.dll", "MessageBoxW", Wnd.Handle, string, "Linked chats", MB_OK | MB_ICONINFORMATION);
return;
}
}
Interop.Call("user32.dll", "MessageBoxW", Wnd.Handle, "No information available now.", "Linked chats", MB_OK | MB_ICONWARNING);
}
/****************************************************************************
*
* Custom functions
*
****************************************************************************/
function link_from (ChatWnd) {
var Wnd;
var contacts;
var i;
var myfolder;
var hicon;
var pair;
Wnd = MsgPlus.CreateWnd("Linked Chats.xml", "LinkedChats");
myfolder = MsgPlus.ScriptFilesPath;
hicon = Interop.Call("shell32.dll", "ExtractIconW", Wnd.Handle, myfolder + "\\Linked Chats.ico", 0);
Interop.Call("user32.dll", "SendMessageW", Wnd.Handle, WM_SETICON, ICON_BIG, hicon);
Interop.Call("user32.dll", "SendMessageW", Wnd.Handle, WM_SETICON, ICON_SMALL, hicon);
contacts = new Enumerator(ChatWnd.Contacts);
for (i = 0; !contacts.atEnd(); contacts.moveNext()) {
var contact = contacts.item();
var icon;
Wnd.LstView_AddItem("LSTContacts_src", "");
Wnd.LstView_SetItemText("LSTContacts_src", i, 1, MsgPlus.RemoveFormatCodes(contact.Name));
Wnd.LstView_SetItemText("LSTContacts_src", i, 2, contact.Email);
Wnd.LstView_SetCheckedState("LSTContacts_src", i, true);
switch (contact.Status) {
case STATUS_ONLINE:
icon = "online";
break;
case STATUS_OFFLINE:
case STATUS_APPEAROFFLINE:
icon = "offline";
break;
case STATUS_BUSY:
case STATUS_ONPHONE:
icon = "busy";
break;
case STATUS_BRB:
case STATUS_IDLE:
case STATUS_AWAY:
case STATUS_OUTLUNCH:
icon = "away";
break;
case STATUS_UNKNOWN:
default:
icon = "";
break;
} // switch (status)
if (contact.Blocked) {
icon = "blocked";
}
if (icon != "") {
Wnd.LstView_SetItemIcon("LSTContacts_src", i, icon, true);
}
i++;
}
Wnd.SetControlText("STASrcCount", i + " contact" + (i != 1 ? "s" : ""));
contacts = new Enumerator(Messenger.MyContacts);
for (i = 0; !contacts.atEnd(); contacts.moveNext()) {
var contact = contacts.item();
var icon;
Wnd.LstView_AddItem("LSTContacts_dst", "");
Wnd.LstView_SetItemText("LSTContacts_dst", i, 1, MsgPlus.RemoveFormatCodes(contact.Name));
Wnd.LstView_SetItemText("LSTContacts_dst", i, 2, contact.Email);
switch (contact.Status) {
case STATUS_ONLINE:
icon = "online";
break;
case STATUS_OFFLINE:
case STATUS_APPEAROFFLINE:
icon = "offline";
break;
case STATUS_BUSY:
case STATUS_ONPHONE:
icon = "busy";
break;
case STATUS_BRB:
case STATUS_IDLE:
case STATUS_AWAY:
case STATUS_OUTLUNCH:
icon = "away";
break;
case STATUS_UNKNOWN:
default:
icon = "";
break;
} // switch (status)
if (contact.Blocked) {
if (icon != "" && icon != "offline") {
icon = "blocked";
} else {
icon = "blocked-offline";
}
}
if (icon != "") {
Wnd.LstView_SetItemIcon("LSTContacts_dst", i, icon, true);
}
i++;
}
pair = {ChatWndOrg : ChatWnd, PrepLinkWnd : Wnd};
PreparedForLinking.push(pair);
}
function link_event (ChatWnd, Contact, Message, EventType, EventSubType) {
var chats_to_close = new Array();
var newGlobalData = new Array();
var i;
for (i = 0; i < GlobalData.length; i++) {
if (EventType == EV_CHAT_CLOSED) {
if (GlobalData[i].ChatWndOrg == ChatWnd || GlobalData[i].ChatWndDst == ChatWnd) {
chats_to_close.push(GlobalData[i].LinkWnd);
} else {
newGlobalData.push(GlobalData[i]);
}
}
if (GlobalData[i].ChatWndOrg == ChatWnd) {
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKPauseLnk")) {
continue;
}
switch (EventType) {
case EV_MSG_SENT:
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKMsgSent")) {
GlobalData[i].ChatWndDst.SendMessage(Contact + " says:\n\t" + Message);
}
break;
case EV_MSG_RECEIVED:
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKMsgRec")) {
switch (EventSubType) {
case MESSAGEKIND_SAYS:
GlobalData[i].ChatWndDst.SendMessage(Contact + " says:\n\t" + Message);
break;
case MESSAGEKIND_WINKS:
GlobalData[i].ChatWndDst.SendMessage(Contact + " winks:\n\t" + Message);
break;
case MESSAGEKIND_VOICECLIPS:
GlobalData[i].ChatWndDst.SendMessage(Contact + " sends a voiceclip:\n\t" + Message);
break;
case MESSAGEKIND_SEARCHING:
GlobalData[i].ChatWndDst.SendMessage(Contact + " searches:\n\t" + Message);
break;
case MESSAGEKIND_FIND:
GlobalData[i].ChatWndDst.SendMessage(Contact + " finds:\n\t" + Message);
break;
case MESSAGEKIND_SAYSOFFLINE:
GlobalData[i].ChatWndDst.SendMessage(Contact + " said:\n\t" + Message);
break;
case MESSAGEKIND_UNKNOWN:
default:
break;
}
}
break;
case EV_CONTACT_ADDED:
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKOther")) {
GlobalData[i].ChatWndDst.SendMessage(Messenger.MyContacts.GetContact(Contact).Name + " (" + Contact + ") has been added to the chat.");
}
break;
case EV_CONTACT_REMOVED:
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKOther")) {
GlobalData[i].ChatWndDst.SendMessage(Messenger.MyContacts.GetContact(Contact).Name + " (" + Contact + ") has been removed from the chat.");
}
break;
case EV_CHAT_CLOSED:
if (GlobalData[i].LinkWnd.Button_IsChecked("CHKOther")) {
GlobalData[i].ChatWndDst.SendMessage("Chat window has been closed.");
}
break;
default:
break;
} // switch (EventType)
} // if (GlobalData[i].ChatWndOrg == ChatWnd)
} // for (i = 0; i < GlobalData.length; i++)
if (EventType == EV_CHAT_CLOSED) {
for (i = 0; i < chats_to_close.length; i++) {
chats_to_close[i].Close(0);
}
if (chats_to_close.length > 0) {
GlobalData = newGlobalData;
}
}
}