mirror of
https://github.com/TribesNext/t2-scripts.git
synced 2026-01-20 02:14:45 +00:00
1034 lines
31 KiB
C#
1034 lines
31 KiB
C#
// TribesNext Project
|
|
// http://www.tribesnext.com/
|
|
// Copyright 2011-2013
|
|
|
|
// Tribes 2 Community System
|
|
// Mail UI Coercion
|
|
|
|
// This script implements connectivity between the Dynamix mail UI shipped with Tribes 2 and the community
|
|
// systems developed for TribesNext. The communication to the TribesNext systems via network is implemented
|
|
// in the robot client data interface script for mail. This script merely connects (modified) Dynamix UI
|
|
// elements to query/invoke methods on this new data interface, instead of the IRC server command used
|
|
// initially.
|
|
|
|
// Several functional changes were made as part of this process. Firstly, all players are now keyed by
|
|
// GUID instead of player name. Since player names are not immutable, it is foolish to use them in ways
|
|
// that assume they are. As a result of this change, the To/CC fields in the mail composition system do
|
|
// not accept input directly from a typing user. If there was a reasonable capability to implement auto
|
|
// completion, it may still have been possible to use this UI element. Instead, users will need to press
|
|
// the associated To/CC buttons to invoke the address book. From here, they can perform search by name,
|
|
// see their buddy list, see fellow members of their clans, and add players to the message (or buddy list).
|
|
|
|
// Second, deleted messages can now be undeleted for a duration. Messages marked as deleted are swept by the
|
|
// remote community system only at an interval. Users can undelete messages until this deletion process is
|
|
// run on the server. Users should not rely on the continued availability of deleted messages, since this
|
|
// sweep process can be run at any time.
|
|
|
|
// Thirdly, there were some hidden user interface elements that were intended for additional functionality,
|
|
// but apparently were never started by Dynamix. This includes a "Sent Item" view, which consists of messages
|
|
// sent by this user to other players. This has now been implemented, and connected to the previously hidden
|
|
// user interface widgets that were present before.
|
|
|
|
// Finally, the original Dynamix code would store mail messages in a local "webcache" file. Since the data
|
|
// used to populate these UIs now comes from another script data source, whose format completely differs from
|
|
// the original, and since the data format parsing facilities of the game are incredibly primitive, there is
|
|
// no longer any local file cache of mail messages.
|
|
|
|
// TODO add scroll handler to load more messages
|
|
|
|
$TribesNext::Community::MailUI::ActiveMailbox = "inbox";
|
|
$TribesNext::Community::MailUI::ActiveRow = -1;
|
|
$TribesNext::Community::MailUI::Awake = 0;
|
|
|
|
// avoid sending garbage to the IRC server, just in case code is missed in the UI
|
|
function DatabaseQuery(%a0, %a1, %a2, %a3)
|
|
{
|
|
error("Uncaught DatabaseQuery(" @ %a0 @ ", " @ %a1 @ ", " @ %a2 @ ", " @ %a3 @ ")");
|
|
}
|
|
|
|
function DatabaseQueryArray(%a0, %a1, %a2, %a3)
|
|
{
|
|
error("Uncaught DatabaseQueryArray(" @ %a0 @ ", " @ %a1 @ ", " @ %a2 @ ", " @ %a3 @ ")");
|
|
}
|
|
|
|
function DatabaseQueryCancel(%a0, %a1, %a2, %a3)
|
|
{
|
|
error("Uncaught DatabaseQueryCancel(" @ %a0 @ ", " @ %a1 @ ", " @ %a2 @ ", " @ %a3 @ ")");
|
|
}
|
|
|
|
function DatabaseQueryi(%a0, %a1, %a2, %a3)
|
|
{
|
|
error("Uncaught DatabaseQueryi(" @ %a0 @ ", " @ %a1 @ ", " @ %a2 @ ", " @ %a3 @ ")");
|
|
}
|
|
|
|
// this function makes some (minor) changes to the Dynamix UI structure
|
|
function tn_community_mailui_modifyGUIData()
|
|
{
|
|
// this UI element is present in the original UI, but it looks like it was never used
|
|
rbSendItems.command = "EMailGui.ButtonClick(2);";
|
|
rbSendItems.setVisible(1);
|
|
|
|
// expand the delete button so that the text "UNDELETE" can be set comfortably
|
|
EM_DeleteBtn.extent = "78 35";
|
|
%shift = 13;
|
|
EM_BlockEditBtn.position = (getWord(EM_DeleteBtn.position, 0) + 49 + %shift) SPC 42;
|
|
EM_BlockBtn.position = (getWord(EM_DeleteBtn.position, 0) + 123 + %shift) SPC 42;
|
|
|
|
// compose window settings changes
|
|
EMail_Subject.maxLength = 250;
|
|
|
|
// compose window -- making these effectively read only, the backing store must change
|
|
EMail_ToEdit.maxLength = 0;
|
|
EMail_ToEdit.validate = "tn_community_mailui_recipientValidate();";
|
|
EMail_CcEdit.maxLength = 0;
|
|
EMail_CcEdit.validate = "tn_community_mailui_recipientValidate();";
|
|
|
|
// block list window settings, remove the unused UI element indicating number of blocks
|
|
%panel = EmailBlockDlg.getObject(0);
|
|
if (%panel.getCount() == 5)
|
|
%panel.getObject(4).setText("");
|
|
|
|
}
|
|
tn_community_mailui_modifyGUIData();
|
|
|
|
// convert from data interface mail structure to the string expected by the Dynamix UI
|
|
function tn_community_mailui_convertMessage(%msg)
|
|
{
|
|
%out = %msg.id @ "\n"; // id
|
|
%out = %out @ %msg.sender @ "\n"; // from
|
|
%out = %out @ (%msg.read $= "true") @ "\n"; // read flag
|
|
%out = %out @ tn_community_mailui_epochToDate(%msg.time) @ "\n"; // send date
|
|
|
|
if (%msg.body !$= "") // mail is loaded
|
|
{
|
|
// to, always at least one
|
|
%count = %msg.toMax;
|
|
for (%i = 0; %i <= %count; %i++)
|
|
%to = %to @ "\t" @ %msg.to[%i];
|
|
%to = getSubStr(%to, 1, strlen(%to));
|
|
if (%msg.ccMax !$= "") // CC, if exists
|
|
{
|
|
%count = %msg.ccMax;
|
|
for (%i = 0; %i <= %count; %i++)
|
|
%cc = %cc @ "\t" @ %msg.cc[%i];
|
|
%cc = getSubStr(%cc, 1, strlen(%cc));
|
|
}
|
|
%out = %out @ %to @ "\n" @ %cc @ "\n";
|
|
%out = %out @ %msg.subject @ "\n";
|
|
%out = %out @ %msg.body;
|
|
}
|
|
else
|
|
{
|
|
// don't have this message actually downloaded
|
|
%out = %out @ "\n\n";
|
|
%out = %out @ %msg.subject @ "\n";
|
|
%out = %out @ "<font:Sui Generis:14><color:00cc00>Loading message. Please wait...";
|
|
}
|
|
}
|
|
|
|
// produces a list of recipients suitable for UI display
|
|
function tn_community_mailui_recipientShowList(%list, %color)
|
|
{
|
|
%entries = getFieldCount(%list);
|
|
%showList = "";
|
|
for (%i = 0; %i < %entries; %i += 4)
|
|
{
|
|
%name = getField(%list, %i);
|
|
%tag = getField(%list, %i + 1);
|
|
%append = getField(%list, %i + 2);
|
|
%guid = getField(%list, %i + 3);
|
|
|
|
if (%color)
|
|
{
|
|
%name = "\c0" @ %name @ "\c3";
|
|
%tag = "\c2" @ %tag @ "\c3";
|
|
}
|
|
|
|
%showName = (%append ? (%name @ %tag) : (%tag @ %name));
|
|
%showList = %showList @ ", " @ %showName;
|
|
}
|
|
return getSubStr(%showList, 2, strlen(%showList));
|
|
}
|
|
|
|
function tn_community_mailui_recipientValidate()
|
|
{
|
|
Email_ToEdit.setText(tn_community_mailui_recipientShowList(Email_ToEdit.backing, 1));
|
|
Email_CCEdit.setText(tn_community_mailui_recipientShowList(Email_CCEdit.backing, 1));
|
|
}
|
|
|
|
function tn_community_mailui_epochToDate(%epoch)
|
|
{
|
|
// uses ruby, since T2 does not expose local system timezone, nor can T2 handle epoch times
|
|
|
|
// verify %epoch uses only numbers for security reasons
|
|
%len = strlen(%epoch);
|
|
for (%i = 0; %i < %len; %i++)
|
|
{
|
|
%char = strcmp(getSubStr(%epoch, %i, 1), "");
|
|
if (%char > 0x39 || %char < 0x30)
|
|
{
|
|
%epoch = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// check memoization table, since ruby computations can be on the expensive side
|
|
%mem = $EpochMem[%epoch];
|
|
if (%mem !$= "")
|
|
return %mem;
|
|
|
|
// pass it to ruby
|
|
$temp = "PROCESSING ERROR";
|
|
rubyEval("tsEval '$temp=\"' + Time.at(" @ %epoch @ ").strftime('%Y-%m-%d %H:%M:%S') + '\";'");
|
|
|
|
// memoize then return
|
|
$EpochMem[%epoch] = $temp;
|
|
return $temp;
|
|
}
|
|
|
|
function tn_community_mailui_clearCheckStatus()
|
|
{
|
|
if (isEventPending($TribesNext::Community::MailUi::StatusSchedule))
|
|
cancel($TribesNext::Community::MailUi::StatusSchedule);
|
|
|
|
if ($TribesNext::Community::Mail::Active)
|
|
{
|
|
$TribesNext::Community::MailUi::StatusSchedule = schedule(32, 0, tn_community_mailui_clearCheckStatus);
|
|
return;
|
|
}
|
|
EmailGui.checkingEmail = 0;
|
|
|
|
$TribesNext::Community::MailUI::ActiveRow = EM_Browser.getSelectedId();
|
|
tn_community_mailui_displayBox($TribesNext::Community::MailUI::ActiveMailbox);
|
|
|
|
if (EmailBlockDlg.gettingList)
|
|
{
|
|
tn_community_mailui_displayBlockList();
|
|
EmailBlockDlg.gettingList = 0;
|
|
}
|
|
if (AddressDlg.searchActive)
|
|
{
|
|
tn_community_mailui_displaySearchResults();
|
|
AddressDlg.searchActive = 0;
|
|
}
|
|
error("Mail UI update.");
|
|
}
|
|
|
|
function tn_community_mailui_displayBox(%mailbox)
|
|
{
|
|
EmailMessageVector.clear();
|
|
EM_Browser.clearList();
|
|
$EmailNextSeq = 0;
|
|
EMailInboxBodyText.setText("");
|
|
|
|
if (%mailbox $= "deleted") // set delete button to undelete mode in deleted items
|
|
EM_DeleteBtn.text = "UNDELETE";
|
|
else
|
|
EM_DeleteBtn.text = "DELETE";
|
|
|
|
%box = tn_community_mail_getMailboxObject(%mailbox);
|
|
%count = %box.getCount();
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%msg = %box.getObject(%i);
|
|
%id = %msg.id;
|
|
EmailNewMessageArrived(tn_community_mailui_convertMessage(%msg), %id);
|
|
}
|
|
EM_Browser.selectRowByID($TribesNext::Community::MailUI::ActiveRow);
|
|
|
|
EM_Browser.sort();
|
|
}
|
|
|
|
function tn_community_mailui_loadSelected()
|
|
{
|
|
if (isEventPending($TribesNext::Community::MailUi::SelectLoadSchedule))
|
|
cancel($TribesNext::Community::MailUi::SelectLoadSchedule);
|
|
|
|
if ($TribesNext::Community::MailUI::Awake)
|
|
{
|
|
%id = EM_Browser.getSelectedId();
|
|
if (%id != -1)
|
|
{
|
|
%msg = tn_community_mail_getMessageObject(%id);
|
|
if (%msg.body $= "" && !%msg.uiRequested)
|
|
{
|
|
%msg.uiRequested = 1;
|
|
tn_community_mail_request_read(%id);
|
|
tn_community_mailui_clearCheckStatus();
|
|
}
|
|
}
|
|
$TribesNext::Community::MailUi::SelectLoadSchedule = schedule(250, 0, tn_community_mailui_loadSelected);
|
|
}
|
|
}
|
|
|
|
// replacing function in webbrowser.cs, 571
|
|
function LinkEMail(%MailTo)
|
|
{
|
|
%count = getRecordCount(%MailTo);
|
|
%recipients = "";
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%record = getRecord(%MailTo, %i);
|
|
%guid = getField(%record, 0);
|
|
%name = getField(%record, 1);
|
|
%tag = getField(%record, 2);
|
|
%append = getField(%record, 3);
|
|
|
|
%player = tn_community_browser_getPlayerProfile(%guid);
|
|
if (%name $= "")
|
|
%name = %player.name;
|
|
if (%tag $= "")
|
|
{
|
|
%tag = getField(%player.tag, 0);
|
|
%append = getField(%player.tag, 1);
|
|
}
|
|
if (%append $= "")
|
|
%append = 0;
|
|
%recipient = %name TAB %tag TAB %append TAB %guid @ "\t";
|
|
%recipients = %recipients @ %recipient;
|
|
}
|
|
%recipients = trim(%recipients);
|
|
Email_ToEdit.backing = %recipients;
|
|
Email_ToEdit.setText(tn_community_mailui_recipientShowList(Email_ToEdit.backing, 1));
|
|
|
|
//Email_ToEdit.setText(%MailTo);
|
|
Email_CCEdit.setText("");
|
|
$EmailSubject = "";
|
|
Canvas.pushDialog(EmailComposeDlg);
|
|
EmailBodyText.setValue("");
|
|
Email_Subject.makeFirstResponder(1);
|
|
}
|
|
|
|
// replacing function in webemail.cs, 369
|
|
function CheckEmail(%schedule)
|
|
{
|
|
if ($TribesNext::Community::UUID $= "") // session not established
|
|
return;
|
|
if (EmailGui.checkingEmail)
|
|
return;
|
|
|
|
if (isEventPending(EmailGui.checkSchedule) && !%scheduled)
|
|
cancel(EmailGui.checkSchedule);
|
|
|
|
EmailGui.checkSchedule = "";
|
|
EMailGui.key = LaunchGui.key++;
|
|
EmailGui.state = "getMail";
|
|
EmailGui.checkingEmail = true;
|
|
|
|
// new code
|
|
if (EMailGui.initialDownloaded)
|
|
{
|
|
// initial messages have already been downloaded -- get updates
|
|
tn_community_mail_request_getNew("inbox");
|
|
tn_community_mail_request_getNew("sentbox");
|
|
tn_community_mail_request_getNew("deleted");
|
|
}
|
|
else
|
|
{
|
|
// no initial messages downloaded yet -- get first chunk
|
|
// this will limit messages to the first chunk in each mailbox
|
|
// and further messages can be downloaded as the user scrolls to the bottom
|
|
EMailGui.initialDownloaded = 1;
|
|
tn_community_mail_request_boxList(0, $TribesNext::Community::Mail::ChunkSize, "inbox", 0);
|
|
tn_community_mail_request_boxList(0, $TribesNext::Community::Mail::ChunkSize, "sentbox", 0);
|
|
tn_community_mail_request_boxList(0, $TribesNext::Community::Mail::ChunkSize, "deleted", 0);
|
|
}
|
|
tn_community_mailui_clearCheckStatus();
|
|
}
|
|
|
|
// replacing function in webemail.cs, 1319
|
|
function EM_Browser::onSelect(%this, %id)
|
|
{
|
|
tn_community_mailui_loadSelected();
|
|
|
|
%text = EmailMessageVector.getLineTextByTag(%id);
|
|
if (rbinbox.getValue())
|
|
{
|
|
if(!getRecord(%text, 2)) // read flag
|
|
{
|
|
%line = EmailMessageVector.getLineIndexByTag(%id);
|
|
%text = setRecord(%text, 2, 1);
|
|
|
|
// Update the GUI:
|
|
%this.setRowFlags( %id, 1 );
|
|
EmailMessageVector.deleteLine(%line);
|
|
EmailMessageVector.insertLine(%line, %text, %id);
|
|
}
|
|
}
|
|
EmailInboxBodyText.setValue(EmailGetTextDisplay(%text));
|
|
EM_ReplyBtn.setActive( true );
|
|
EM_ReplyToAllBtn.setActive( true );
|
|
EM_ForwardBtn.setActive( true );
|
|
EM_DeleteBtn.setActive( true );
|
|
EM_BlockBtn.setActive( true );
|
|
}
|
|
|
|
// replacing function in webemail.cs, 297
|
|
function EmailGetTextDisplay(%text)
|
|
{
|
|
// get ID to check some additional properties
|
|
%id = getRecord(%text, 0);
|
|
%msg = tn_community_mail_getMessageObject(%id);
|
|
if (%msg.deleted $= "true")
|
|
%prepend = "<spush><font:Sui Generis:14><color:cc0000>Message has been deleted and will be removed from the mail system soon.<spop>\n";
|
|
|
|
%toList = getRecord(%text, 4);
|
|
%to = getLinkNameList(%toList);
|
|
%ccList = getRecord(%text, 5);
|
|
%ccLine = getLinkNameList(%ccList);
|
|
|
|
// DarkDragonDX: Check if it's a tribal invite
|
|
%subjectLine = getRecord(%text, 6);
|
|
%emailContents = EmailGetBody(%text);
|
|
%senderName = getLinkName(getRecord(%text, 1), 0);
|
|
|
|
if (getWords(%subjectLine, 0, 1) $= "Invitation to:")
|
|
{
|
|
%emailContents = tn_community_mail_explodeJSONObject(%emailContents);
|
|
%clanID = tn_community_mail_getJSONElement(%emailContents, "clanid");
|
|
%expiration = tn_community_mail_getJSONElement(%emailContents, "expire");
|
|
|
|
%emailContents = %senderName SPC "of clan \"" @ trim(getWords(%subjectLine, 2)) @ "\" has invited you to join their clan." NL
|
|
"<a:acceptinvite-" @ %clanID @ ">Accept</a> or <a:rejectinvite-" @ %clanID @ ">Reject</a> the invitation? This invitation expires at <spush><color:ADFFFA>" @ tn_community_mailui_epochToDate(%expiration) @ "<spop>.";
|
|
}
|
|
|
|
%from = %senderName;
|
|
%msgtext = "From: " @ %from NL
|
|
"To: " @ %to NL
|
|
"CC: " @ %ccLine NL
|
|
"Subject: " @ %subjectLine NL
|
|
"Date Sent: " @ getRecord(%text, 3) @ "\n\n" @
|
|
%emailContents;
|
|
|
|
return %prepend @ %msgtext;
|
|
}
|
|
|
|
// replacing function in webemail.cs, 401
|
|
function EmailEditBlocks()
|
|
{
|
|
// this function is called when bringing up the block list editor
|
|
// -- initially this initiated a database query that would populate the UI
|
|
// as it was recieved. instead, this will be dealt with during the rest of the UI update
|
|
Canvas.pushDialog(EmailBlockDlg);
|
|
EmailBlockList.clear();
|
|
EMailBlockDlg.key = LaunchGui.key++;
|
|
EmailBlockDlg.state = "getBlocklist";
|
|
|
|
EmailBlockDlg.gettingList = 1;
|
|
|
|
tn_community_mail_request_viewList("ignore");
|
|
tn_community_mailui_clearCheckStatus();
|
|
}
|
|
|
|
function tn_community_mailui_displayBlockList()
|
|
{
|
|
// update the block list UI from the data interface cache
|
|
if ($TMail::ListMax["ignore"] $= "")
|
|
return;
|
|
%count = $TMail::ListMax["ignore"];
|
|
for (%i = 0; %i <= %count; %i++)
|
|
{
|
|
%player = $TMail::ListVals["ignore", %i];
|
|
|
|
%name = getField(%player, 0);
|
|
%tag = getField(%player, 1);
|
|
%append = getField(%player, 2);
|
|
%guid = getField(%player, 3);
|
|
|
|
%showName = (%append ? (%name @ %tag) : (%tag @ %name));
|
|
EmailBlockList.addRow(%guid, %showName);
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 410
|
|
function EmailBlockSender()
|
|
{
|
|
%id = EM_Browser.getSelectedId();
|
|
if ( %id == -1 )
|
|
{
|
|
MessageBoxOK("WARNING","You cannot block a non-existent sender.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
%text = EmailMessageVector.getLineTextByTag(EM_Browser.getSelectedId());
|
|
%blockUser = getRecord(%text, 1);
|
|
|
|
%name = getField(%blockUser, 0);
|
|
%tag = getField(%blockUser, 1);
|
|
%append = getField(%blockUser, 2);
|
|
%guid = getField(%blockUser, 3);
|
|
|
|
%showName = (%append ? (%name @ %tag) : (%tag @ %name));
|
|
MessageBoxYesNo("CONFIRM BLOCK","Are you sure you want to block " @ %showName @ "?","tn_community_mail_request_addListEntry(\"ignore\", " @ %guid @ ");");
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 431
|
|
function EmailBlockRemove()
|
|
{
|
|
%rowId = EmailBlockList.getSelectedId();
|
|
if(%rowId == -1)
|
|
{
|
|
MessageBoxOK("WARNING","You cannot remove a non-existent block.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
%line = EmailBlockList.getRowTextById(%rowId);
|
|
%name = getField(%line, 2);
|
|
EMailBlockDlg.state = "removeBlock";
|
|
EMailBlockDlg.key = LaunchGui.key++;
|
|
EmailBlockList.removeRowById(%rowId);
|
|
|
|
tn_community_mail_request_delListEntry("ignore", %rowId);
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 43
|
|
function EmailMessageNew()
|
|
{
|
|
Email_ToEdit.backing = "";
|
|
Email_ToEdit.setText("");
|
|
Email_CCEdit.backing = "";
|
|
Email_CCEdit.setText("");
|
|
$EmailSubject = "";
|
|
EmailBodyText.setValue("");
|
|
|
|
EMailComposeDlg.state = "sendMail";
|
|
Canvas.pushDialog(EmailComposeDlg);
|
|
Email_ToEdit.makeFirstResponder(1);
|
|
}
|
|
|
|
// replacing function in webemail.cs, 55
|
|
function EmailMessageReply()
|
|
{
|
|
EMailComposeDlg.state = "replyMail";
|
|
%text = EmailMessageVector.getLineTextByTag( EM_Browser.getSelectedId() );
|
|
Email_ToEdit.backing = getRecord(%text, 1);
|
|
Email_ToEdit.setText(tn_community_mailui_recipientShowList(Email_ToEdit.backing, 1));
|
|
Email_CCEdit.backing = "";
|
|
Email_CCEdit.setText("");
|
|
$EmailSubject = "RE: " @ getRecord(%text, 6);
|
|
%date = getRecord(%text, 3);
|
|
Canvas.pushDialog(EmailComposeDlg);
|
|
|
|
%player = Email_ToEdit.getValue();
|
|
%name = getField(%player, 0);
|
|
%tag = getField(%player, 1);
|
|
%append = getField(%player, 2);
|
|
%guid = getField(%player, 3);
|
|
|
|
%showName = (%append ? (%name @ %tag) : (%tag @ %name));
|
|
|
|
EmailBodyText.setValue("\n\n----------------------------------\n On " @ %date SPC %showName @ " wrote:\n\n" @ EmailGetBody(%text) );
|
|
EmailBodyText.SetCursorPosition(0);
|
|
EmailBodyText.makeFirstResponder(1);
|
|
}
|
|
|
|
function EmailMessageForward()
|
|
{
|
|
%text = EmailMessageVector.getLineTextByTag( EM_Browser.getSelectedId() );
|
|
Email_ToEdit.backing = "";
|
|
Email_ToEdit.setText("");
|
|
Email_CCEdit.backing = "";
|
|
Email_CCEdit.setText("");
|
|
$EmailSubject = "FW: " @ getRecord(%text, 6);
|
|
Canvas.pushDialog(EmailComposeDlg);
|
|
EmailBodyText.setValue("\n\n\n--- Begin Forwarded Message ---\n\n" @ EmailGetTextDisplay(%text));
|
|
Email_toEdit.makeFirstResponder(1);
|
|
EmailBodyText.SetCursorPosition(0);
|
|
EMailComposeDlg.state = "forwardMail";
|
|
}
|
|
// replacing function in webemail.cs, 82
|
|
function EmailMessageReplyAll()
|
|
{
|
|
EMailComposeDlg.state = "replyAll";
|
|
%text = EmailMessageVector.getLineTextByTag( EM_Browser.getSelectedId() );
|
|
Email_ToEdit.backing = getRecord(%text, 1);
|
|
Email_ToEdit.setText(tn_community_mailui_recipientShowList(Email_ToEdit.backing, 1));
|
|
Email_CCEdit.backing = getRecord(%text, 4) @ "\t" @ getRecord(%text,5);
|
|
Email_CCEdit.setText(tn_community_mailui_recipientShowList(Email_CCEdit.backing, 1));
|
|
$EmailSubject = "RE: " @ getRecord(%text, 6);
|
|
%date = getRecord(%text, 3);
|
|
Canvas.pushDialog(EmailComposeDlg);
|
|
|
|
%player = Email_ToEdit.getValue();
|
|
%name = getField(%player, 0);
|
|
%tag = getField(%player, 1);
|
|
%append = getField(%player, 2);
|
|
%guid = getField(%player, 3);
|
|
|
|
%showName = (%append ? (%name @ %tag) : (%tag @ %name));
|
|
|
|
EmailBodyText.setValue("\n\n===========================\n On " @ %date SPC %showName @ " wrote:\n\n" @ EmailGetBody(%text) );
|
|
EmailBodyText.makeFirstResponder(1);
|
|
EmailBodyText.SetCursorPosition(0);
|
|
}
|
|
|
|
// replacing function in webemail.cs, 145
|
|
function EmailSend()
|
|
{
|
|
EMailComposeDlg.key = LaunchGui.key++;
|
|
EMailComposeDlg.state = "sendMail";
|
|
|
|
%to = tn_community_mailui_extractRecipientIds(Email_ToEdit.backing);
|
|
%cc = tn_community_mailui_extractRecipientIds(Email_CCEdit.backing);
|
|
%subj = $EmailSubject;
|
|
%text = EMailBodyText.getValue();
|
|
|
|
tn_community_mail_request_send(%subj, %text, %to, %cc);
|
|
Canvas.popDialog(EmailComposeDlg);
|
|
|
|
// run checkemail to update the list of messages in the mailboxes
|
|
CheckEmail();
|
|
}
|
|
|
|
function tn_community_mailui_extractRecipientIds(%recipients)
|
|
{
|
|
%entries = getFieldCount(%recipients);
|
|
%guidList = "";
|
|
for (%i = 0; %i < %entries; %i += 4)
|
|
{
|
|
%name = getField(%recipients, %i);
|
|
%tag = getField(%recipients, %i + 1);
|
|
%append = getField(%recipients, %i + 2);
|
|
%guid = getField(%recipients, %i + 3);
|
|
|
|
%guidList = %guidList @ "," @ %guid;
|
|
}
|
|
return getSubStr(%guidList, 1, strlen(%guidList));
|
|
}
|
|
|
|
// replacing function in webemail.cs, 96
|
|
function EmailMessageDelete()
|
|
{
|
|
%id = EM_Browser.getSelectedId();
|
|
if ( %id == -1 )
|
|
return;
|
|
|
|
EMailComposeDlg.key = LaunchGui.key++;
|
|
|
|
// Make these buttons inactive until another message is selected:
|
|
%state = 1;
|
|
if ($TribesNext::Community::MailUI::ActiveMailbox $= "deleted")
|
|
%state = 0;
|
|
DoEmailDelete(%id, %state);
|
|
}
|
|
|
|
// replacing function in webemail.cs, 121
|
|
function DoEmailDelete(%mid, %state)
|
|
{
|
|
%row = EM_Browser.findById(%mid);
|
|
|
|
EM_ReplyBtn.setActive( false );
|
|
EM_ReplyToAllBtn.setActive( false );
|
|
EM_ForwardBtn.setActive( false );
|
|
EM_DeleteBtn.setActive( false );
|
|
EM_BlockBtn.setActive( false );
|
|
|
|
EM_Browser.removeRowByIndex(%row);
|
|
EmailMessageVector.deleteLine(EmailMessageVector.getLineIndexByTag(%mid));
|
|
|
|
if ( EM_Browser.rowCount() == 0 )
|
|
EMailInboxBodyText.setText("");
|
|
else
|
|
EM_Browser.setSelectedRow(%row);
|
|
|
|
tn_community_mail_request_deleteMessage(%mid, %state);
|
|
tn_community_mailui_clearCheckStatus();
|
|
}
|
|
|
|
// replacing function in webemail.cs, 1229
|
|
function EmailGui::loadCache(%this) { }
|
|
// replacing function in webemail.cs, 1274
|
|
function EmailGui::dumpCache(%this) { }
|
|
// replacing function in webemail.cs, 1174
|
|
function EmailGui::getCache(%this) { %this.cacheLoaded = true; }
|
|
|
|
// addressdlg related functions in webemail
|
|
|
|
// replacing function in webemail.cs, 823
|
|
function AddressDlg::GoSearch(%this)
|
|
{
|
|
if(trim(LC_Search.getValue()) !$="")
|
|
{
|
|
%this.key = LaunchGui.key++;
|
|
%this.state = "goSearch";
|
|
%this.lbstate = "errorcheck";
|
|
LC_BigList.mode = "select";
|
|
|
|
// searching via mail API
|
|
LC_BigList.clear();
|
|
AddressDlg.searchActive = 1;
|
|
tn_community_mail_request_search(LC_Search.getValue());
|
|
tn_community_mailui_clearCheckStatus();
|
|
|
|
LC_BuddyListBtn.direction = 0;
|
|
LC_BuddyListBtn.text = "ADD TO BUDDYLIST";
|
|
LC_ListBox.setSelected(0);
|
|
}
|
|
else
|
|
MessageBoxOK("DENIED", "Blank searches for player names are not permitted. Please enter the start of the player name you are seeking.");
|
|
}
|
|
|
|
function tn_community_mailui_displaySearchResults()
|
|
{
|
|
if (LC_BigList.mode $= "select" || LC_BigList.mode $= "")
|
|
{
|
|
// update the search UI from the data interface cache
|
|
if ($TMail::SearchMax $= "")
|
|
return;
|
|
%count = $TMail::SearchMax;
|
|
for (%i = 0; %i <= %count; %i++)
|
|
{
|
|
%player = $TMail::SearchVals[%i];
|
|
%guid = getField(%player, 3);
|
|
|
|
if (%guid !$= "")
|
|
LC_BigList.addRow(%guid, %player);
|
|
}
|
|
}
|
|
else if (LC_BigList.mode $= "buddy")
|
|
{
|
|
// update the block list UI from the data interface cache
|
|
if ($TMail::ListMax["buddy"] $= "")
|
|
return;
|
|
%count = $TMail::ListMax["buddy"];
|
|
for (%i = 0; %i <= %count; %i++)
|
|
{
|
|
%player = $TMail::ListVals["buddy", %i];
|
|
%guid = getField(%player, 3);
|
|
if (%guid !$= "")
|
|
LC_BigList.addRow(%guid, %player);
|
|
}
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 742
|
|
function AddressDlg::AddBuddylist(%this)
|
|
{
|
|
%this.key = LaunchGui.key++;
|
|
%this.lbstate = "buddylist";
|
|
|
|
switch (%this.SrcList)
|
|
{
|
|
case 0:
|
|
%addremove = LC_BuddyListBtn.direction;
|
|
%player = LC_BigList.getValue();
|
|
%selRow = LC_BigList.getRownumByID(LC_BigList.GetSelectedID());
|
|
case 1:
|
|
%addremove = 0;
|
|
%player = LC_ToList.getValue();
|
|
case 2:
|
|
%addremove = 0;
|
|
%player = LC_CCList.getValue();
|
|
}
|
|
%guid = getField(%player, 3);
|
|
|
|
if (%guid !$= "")
|
|
{
|
|
if (%addremove==0)
|
|
{
|
|
%this.doRefresh = 1;
|
|
%this.state = "addBuddy";
|
|
tn_community_mail_request_addListEntry("buddy", %guid);
|
|
//DatabaseQuery(10,%player,%this,%this.key);
|
|
}
|
|
else
|
|
{
|
|
%this.state = "dropBuddy";
|
|
tn_community_mail_request_delListEntry("buddy", %guid);
|
|
//DatabaseQuery(11,%player,%this,%this.key);
|
|
LC_BigList.removeRowbyId(LC_BigList.getSelectedID());
|
|
if(%selRow>=LC_BigList.RowCount())
|
|
%selRow = LC_BigList.RowCount()-1;
|
|
LC_BigList.setSelectedRow(%selRow);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
error("Trying to modify buddy list on player data missing GUID: " @ %player);
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 839
|
|
function AddressDlg::GoList(%this)
|
|
{
|
|
%this.key = LaunchGui.key++;
|
|
%this.lbstate = "errorcheck";
|
|
if(LC_ListBox.getValue() $= "Select List")
|
|
{
|
|
LC_BigList.mode = "select";
|
|
LC_BigList.clear();
|
|
}
|
|
else if(LC_ListBox.getValue() $= "Buddy List")
|
|
{
|
|
LC_BigList.mode = "buddy";
|
|
LC_BigList.clear();
|
|
%this.state = "getBuddyList";
|
|
AddressDlg.searchActive = 1;
|
|
tn_community_mail_request_viewList("buddy");
|
|
LC_BuddyListBtn.direction = 1;
|
|
LC_BuddyListBtn.text = "REMOVE FROM BUDDYLIST";
|
|
}
|
|
else
|
|
{
|
|
LC_BigList.mode = "clan";
|
|
LC_BigList.clear();
|
|
|
|
LC_BuddyListBtn.direction = 0;
|
|
LC_BuddyListBtn.text = "ADD TO BUDDYLIST";
|
|
|
|
%clanid = LC_ListBox.getSelected();
|
|
%clan = tn_community_browser_getClanProfile(%clanid);
|
|
|
|
%pcount = %clan.pcount;
|
|
if (%pcount !$= "")
|
|
{
|
|
for (%i = 0; %i <= %pcount; %i++)
|
|
{
|
|
%member = %clan.player[%i];
|
|
%mguid = getField(%member, 3);
|
|
if (%mguid != getField(WONGetAuthInfo(), 3))
|
|
LC_BigList.addRow(%mguid, getFields(%member, 0, 3));
|
|
}
|
|
}
|
|
}
|
|
tn_community_mailui_clearCheckStatus();
|
|
}
|
|
|
|
// replacing function in webemail.cs, 777
|
|
function AddressDlg::AddCC(%this)
|
|
{
|
|
if(LC_CCListBtn.direction == 0)
|
|
{
|
|
%addName = LC_BigList.getRowTextById(LC_BigList.getSelectedID());
|
|
%hasDupes = CheckAllDuplicates(%addName);
|
|
if(%hasDupes == 0)
|
|
LC_CCList.addRow(LC_CCList.RowCount()+1, %addName);
|
|
}
|
|
else
|
|
{
|
|
%selRow = LC_CCList.getRownumByID(LC_CCList.GetSelectedID());
|
|
LC_CCList.removeRowbyID(LC_CCList.getSelectedID());
|
|
if(%selRow>=LC_CCList.RowCount())
|
|
%selRow = LC_CCList.RowCount()-1;
|
|
LC_CCList.setSelectedRow(%selRow);
|
|
}
|
|
%this.DestList = 1;
|
|
}
|
|
|
|
// replacing function in webemail.cs, 797
|
|
function AddressDlg::AddTo(%this)
|
|
{
|
|
if(LC_ToListBtn.direction == 0)
|
|
{
|
|
%addName = LC_BigList.getRowTextById(LC_BigList.getSelectedID());
|
|
%hasDupes = CheckAllDuplicates(%addName);
|
|
if(%hasDupes == 0 )
|
|
LC_ToList.addRow(LC_ToList.RowCount()+1, %addName);
|
|
}
|
|
else
|
|
{
|
|
%selRow = LC_ToList.getRownumByID(LC_ToList.GetSelectedID());
|
|
LC_ToList.removeRowbyID(LC_ToList.getSelectedID());
|
|
if(%selRow>=LC_ToList.RowCount())
|
|
%selRow = LC_ToList.RowCount()-1;
|
|
LC_ToList.SetSelectedRow(%selRow);
|
|
}
|
|
%this.DestList = 0;
|
|
}
|
|
|
|
// replacing function in webemail.cs, 863
|
|
function AddressDlg::OK(%this)
|
|
{
|
|
EMail_ToEdit.backing = ListToStr(LC_ToList,"\t");
|
|
EMail_CCEdit.backing = ListToStr(LC_CCList,"\t");
|
|
|
|
tn_community_mailui_recipientValidate();
|
|
|
|
LC_BigList.Clear();
|
|
Canvas.PopDialog("AddressDlg");
|
|
}
|
|
|
|
// replacing function in webemail.cs, 602
|
|
function ListToStr(%listName,%delim)
|
|
{
|
|
%str = "";
|
|
%rCount = %listName.rowCount();
|
|
if (%rCount > 0)
|
|
{
|
|
for(%r=0;%r<%rCount;%r++)
|
|
{
|
|
%str = %str @ %listName.getRowText(%r);
|
|
if(%r < %rCount-1)
|
|
{
|
|
%str = %str @ %delim;
|
|
}
|
|
}
|
|
}
|
|
return %str;
|
|
}
|
|
|
|
function tn_community_mailui_populateRList(%list, %backing)
|
|
{
|
|
%entries = getFieldCount(%backing);
|
|
%showList = "";
|
|
for (%i = 0; %i < %entries; %i += 4)
|
|
{
|
|
%name = getField(%backing, %i);
|
|
%tag = getField(%backing, %i + 1);
|
|
%append = getField(%backing, %i + 2);
|
|
%guid = getField(%backing, %i + 3);
|
|
|
|
%list.addRow(%guid, %name TAB %tag TAB %append TAB %guid);
|
|
}
|
|
}
|
|
|
|
// replacing function in webemail.cs, 953
|
|
function AddressDlg::onWake(%this)
|
|
{
|
|
%this.doRefresh = 0;
|
|
%this.key = LaunchGui.key++;
|
|
%this.state = "loadlistbox";
|
|
%this.lbstate = "errorcheck";
|
|
%this.DestList = 0;
|
|
%this.SrcList = 0;
|
|
LC_BuddyListBtn.setVisible(0);
|
|
LC_ListBox.Clear();
|
|
LC_ListBox.Add("Select List",0);
|
|
LC_ListBox.Add("Buddy List",1);
|
|
LC_ListBox.setSelected(0);
|
|
LC_Search.clear();
|
|
|
|
//StrToList(LC_ToList,Email_ToEdit.getValue(),",");
|
|
LC_ToList.clear();
|
|
tn_community_mailui_populateRList(LC_ToList, EMail_ToEdit.backing);
|
|
//StrToList(LC_CCList,Email_CCEdit.getValue(),",");
|
|
LC_CCList.clear();
|
|
tn_community_mailui_populateRList(LC_CcList, EMail_CCEdit.backing);
|
|
|
|
// retrieve a list of clans the user is in
|
|
// and make the list of members available for easy emailing.
|
|
%myguid = getField(WONGetAuthInfo(), 3);
|
|
%player = tn_community_browser_getPlayerProfile(%myguid);
|
|
|
|
%mcount = %player.mcount;
|
|
if (%mcount !$= "")
|
|
{
|
|
%ptag = getField(%player.tag, 0);
|
|
for (%i = 0; %i <= %mcount; %i++)
|
|
{
|
|
%membership = %player.membership[%i];
|
|
%mid = getField(%membership, 0);
|
|
%mname = getField(%membership, 1);
|
|
|
|
LC_ListBox.add(%mname, %mid);
|
|
}
|
|
}
|
|
}
|
|
|
|
function tn_community_mailui_selectedBox(%box)
|
|
{
|
|
switch (%box)
|
|
{
|
|
case 0: // wired to inbox button
|
|
$TribesNext::Community::MailUI::ActiveMailbox = "inbox";
|
|
tn_community_mailui_clearCheckStatus();
|
|
tn_community_mailui_displayBox("inbox");
|
|
case 1: // wired to deleted items button
|
|
$TribesNext::Community::MailUI::ActiveMailbox = "deleted";
|
|
tn_community_mailui_clearCheckStatus();
|
|
tn_community_mailui_displayBox("deleted");
|
|
case 2: // newly wired to sent items button which was present, but hidden
|
|
$TribesNext::Community::MailUI::ActiveMailbox = "sentbox";
|
|
tn_community_mailui_clearCheckStatus();
|
|
tn_community_mailui_displayBox("sentbox");
|
|
}
|
|
}
|
|
|
|
package tn_tmail
|
|
{
|
|
function EmailGui::onWake(%this)
|
|
{
|
|
Parent::onWake(%this);
|
|
|
|
// Make these buttons inactive until a message is selected:
|
|
EM_ReplyBtn.setActive( false );
|
|
EM_ReplyToAllBtn.setActive( false );
|
|
EM_ForwardBtn.setActive( false );
|
|
EM_DeleteBtn.setActive( false );
|
|
EM_BlockBtn.setActive( false );
|
|
%selId = EM_Browser.getSelectedId();
|
|
Canvas.pushDialog(LaunchToolbarDlg);
|
|
|
|
// DarkDragonDX: The mailUI override for selected buttons didn't work
|
|
rbInbox.command = "tn_community_mailui_selectedBox(0);";
|
|
rbSendItems.command = "tn_community_mailui_selectedBox(2);";
|
|
rbDeleted.command = "tn_community_mailui_selectedBox(1);";
|
|
|
|
if ( EM_Browser.rowCount() > 0 )
|
|
{
|
|
%row = EM_Browser.findById( %selId );
|
|
if ( %row == -1 )
|
|
EM_Browser.setSelectedRow( 0 );
|
|
else
|
|
EM_Browser.setSelectedRow( %row );
|
|
}
|
|
|
|
//error("EmailGui::onWake: " @ %this);
|
|
$TribesNext::Community::MailUI::Awake = 1;
|
|
tn_community_mailui_loadSelected();
|
|
}
|
|
|
|
function EmailGui::onSleep(%this)
|
|
{
|
|
Parent::onSleep(%this);
|
|
$TribesNext::Community::MailUI::Awake = 0;
|
|
//error("EmailGui::onSleep: " @ %this);
|
|
}
|
|
|
|
// DarkDragonDX: Overwrite this function for the "GET MAIL" Button
|
|
function GetEmailBtnClick()
|
|
{
|
|
// We request the TMail and when the request completes, the callback
|
|
// tn_community_mail_requestCompleted is executed.
|
|
tn_community_mail_request_getNew($TribesNext::Community::MailUI::ActiveMailbox);
|
|
}
|
|
|
|
function tn_community_mail_requestCompleted()
|
|
{
|
|
parent::tn_community_mail_requestCompleted();
|
|
|
|
// Add a small delay to make sure we have everything
|
|
schedule(200,0,"tn_community_mailui_displayBox", $TribesNext::Community::MailUI::ActiveMailbox);
|
|
}
|
|
|
|
function GuiMLTextCtrl::onURL(%this, %url)
|
|
{
|
|
%payload = strReplace(%url, "-", " ");
|
|
%command = getWord(%payload, 0);
|
|
%identifier = getWord(%payload, 1);
|
|
|
|
switch$(%command)
|
|
{
|
|
case "acceptinvite":
|
|
tn_community_browser_user_acceptInvite(%identifier);
|
|
EmailMessageDelete(); // This code shouldn't be executed unless we clicked on accept/reject in an invitations
|
|
messageBoxOK("ACCEPTED", "You have accepted the clan invitation.");
|
|
|
|
case "rejectinvite":
|
|
tn_community_browser_user_rejectInvite(%identifier);
|
|
EmailMessageDelete();
|
|
messageBoxOK("DECLINED", "You have rejected the clan invitation.");
|
|
|
|
default: // Pass it on to anything else interested
|
|
parent::onURL(%this, %url);
|
|
}
|
|
}
|
|
};
|
|
if (!isActivePackage(tn_tmail))
|
|
activatePackage(tn_tmail);
|
|
|