TribesReplay/base/scripts/ChatGui.cs
2017-07-17 22:55:25 -04:00

2909 lines
88 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//------------------------------------------------------------------------------
//
// ChatGui.cs
//
//------------------------------------------------------------------------------
$CHANNEL_STATUS = "STATUS";
$VERSION_STRING = "Dynamix IRC Chat 1.2.0";
$ESCAPE_SEQ = "_-_";
$IRCClient::serverList = GetIRCServerList(0);
$IRCClient::serverCount = getRecordCount($IRCClient::serverList);
$IRCClient::retries = -1;
if ($IRCClient::serverCount > 1)
$IRCClient::serverIndex = getRandom($IRCClient::serverCount-1)-1;
else
$IRCClient::serverIndex = -1;
$IRCClient::serverAttempt = 0;
$AWAY_TIMEOUT = 5 * 60 * 1000;
$VERSION_FLOOD_TIMEOUT = 5.0;
$PING_FLOOD_TIMEOUT = 5.0;
// Person flags
$PERSON_SPEAKER = 1;
$PERSON_OPERATOR = 2;
$PERSON_IGNORE = 4;
$PERSON_AWAY = 8;
// Channel flags
$CHANNEL_PRIVATE = 1;
$CHANNEL_MODERATED = 2;
$CHANNEL_INVITE = 4;
$CHANNEL_LIMITED = 8;
$CHANNEL_NEWMESSAGE = 16;
$CHANNEL_IGNORE_EXTERN = 32;
$CHANNEL_SECRET = 64;
$CHANNEL_TOPIC_LIMITED = 128;
$CHANNEL_HAS_KEY = 256;
$CHANNEL_NEW = 512;
// Default messages (if gui is left blank)
$DefaultChatAwayMessage = "Don't be alarmed. I'm going to step away from my computer.";
$DefaultChatKickMessage = "Alright, you\'re outta here!";
$DefaultChatBanMessage = "You, and three generations of your offspring, are banned from this channel.";
//------------------------------------------------------------------------------
function JoinChatDlg::onWake(%this)
{
if ($IRCClient::state $= IDIRC_CONNECTED)
IRCClient::requestChannelList();
else
MessageBoxYesNo("Connect IRC","Connect to IRC server?","IRCClient::connect();","Canvas.popDialog(JoinChatDlg);");
}
//------------------------------------------------------------------------------
function JoinChatList::onSelect(%this,%id,%text)
{
JoinChatName.setValue(%text);
}
//------------------------------------------------------------------------------
function JoinChatDlg::join(%this)
{
if(trim(JoinChatName.getValue()) $= "")
{
messageBoxOK("ERROR", "Invalid Channel Name");
return;
}
else
{
IRCClient::join(IRCClient::channelName(trim( JoinChatName.getValue()) ));
Canvas.popDialog(JoinChatDlg);
LaunchTabView.viewTab("CHAT", ChatGui, 0);
}
}
//------------------------------------------------------------------------------
function ChatGui::onAdd(%this)
{
// Add the Member popup menu:
new GuiControl(ChatMemberActionDlg) {
profile = "GuiModelessDialogProfile";
horizSizing = "width";
vertSizing = "height";
position = "0 0";
extent = "640 480";
minExtent = "8 8";
visible = "1";
setFirstResponder = "0";
modal = "1";
new ShellPopupMenu(ChatMemberPopup) {
profile = "ShellPopupProfile";
position = "0 0";
extent = "0 0";
minExtent = "0 0";
visible = "1";
maxPopupHeight = "200";
noButtonStyle = "1";
};
};
}
//------------------------------------------------------------------------------
function ChatGui::onWake(%this)
{
Canvas.pushDialog(LaunchToolbarDlg);
ChatTabView.addSet(1,"gui/shll_horztabbuttonB","5 5 5","50 50 0","5 5 5");
ChatGui.awake = true;
ChatTabView.setSelected($IRCClient::currentChannel);
ChatGuiScroll.scrollToBottom();
ChatMessageEntry.schedule(1, makeFirstResponder, true);
}
//------------------------------------------------------------------------------
function ChatGui::setKey(%this,%ignore)
{
}
//------------------------------------------------------------------------------
function ChatTabView::onAdd(%this)
{
if ($LaunchMode $= "Normal")
%this.addTab($IRCClient::channels.getObject(0),"STATUS");
}
//------------------------------------------------------------------------------
function ChatTabView::onSelect(%this,%obj,%name)
{
ChatTabFrame.setAltColor(%obj.private);
%i = %obj.findMember($IRCClient::people.getObject(0));
ChatEditChannelBtn.setVisible(%obj.getFlags(%i) & $PERSON_OPERATOR);
//is this the status window? do we need the options button
%vis = (%name $= "STATUS" ? true : false);
ChatEditOptionsBtn.setVisible(%vis);
ChatChannelTopic.setValue(%obj.topic);
if (ChatGui.awake)
{
if ($IRCClient::currentChannel == $IRCClient::attachedChannel)
ChatGuiMessageVector.detach();
ChatGuiMessageVector.attach(%obj);
$IRCClient::attachedChannel = %obj;
}
$IRCClient::currentChannel = %obj;
ChatRoomMemberList_refresh(%obj);
ChatMessageEntry.schedule(1, makeFirstResponder, true);
}
//------------------------------------------------------------------------------
function ChatTabView::openNewPane(%this)
{
Canvas.pushDialog(JoinChatDlg);
}
//------------------------------------------------------------------------------
function ChatTabView::closeCurrentPane(%this)
{
if ($IRCClient::currentChannel == $IRCClient::channels.getObject(0))
LaunchTabView.closeCurrentTab();
else
IRCClient::part($IRCClient::currentChannel.getName());
}
//------------------------------------------------------------------------------
function JoinPublicTribeChannel(%tribe)
{
IRCClient::join(IRCClient::channelName(%tribe) @ "_Public");
LaunchTabView.viewTab("CHAT",ChatGui,0);
}
//------------------------------------------------------------------------------
function JoinPrivateTribeChannel(%tribe)
{
IRCClient::join(IRCClient::channelName(%tribe) @ "_Private");
LaunchTabView.viewTab("CHAT",ChatGui,0);
}
//------------------------------------------------------------------------------
function KeyChannelJoin()
{
Canvas.popDialog(ChannelKeyDlg);
IRCClient::join($IRCClient::keyChannel SPC EditChannelKey.getValue());
}
//------------------------------------------------------------------------------
function ChatGuiMessageVector::urlClickCallback(%this,%type,%url,%content)
{
switch$(%type)
{
case "http":
gotoWebPage(%url);
case "server":
IRCClient::onJoinGame(%content,%url);
%url = nextToken(%url,a," ");
%url = nextToken(%url,map,"(");
%url = nextToken(%url,type,")");
// set the loading gui
// LoadingGui.map = %map;
// LoadingGui.missionType = %type;
// Canvas.setContent(LoadingGui);
// Canvas.repaint();
JoinGame(%content);
case "warrior":
LaunchBrowser(%url,"Warrior");
}
}
//------------------------------------------------------------------------------
function ChatSendText()
{
if ($IRCClient::people.getObject(0).flags & $PERSON_AWAY)
IRCClient::away("");
else
{
if ($IRCClient::awaytimeout)
cancel($IRCClient::awaytimeout);
$IRCClient::awaytimeout = schedule($AWAY_TIMEOUT,0,"ChatAway_Timeout");
}
if ($IRCClient::currentChannel.private)
IRCClient::send2(ChatMessageEntry.getValue(),$IRCClient::currentChannel.getName());
else
IRCClient::send2(ChatMessageEntry.getValue(),"");
ChatMessageEntry.setValue("");
}
//------------------------------------------------------------------------------
function ChatAway_Timeout()
{
$IRCClient::awaytimeout = 0;
IRCClient::away($pref::IRCClient::awaymsg);
}
//------------------------------------------------------------------------------
function ChatRoomMemberList::onAdd(%this)
{
ChatRoomMemberList.addStyle($PERSON_OPERATOR,
"sys_op_eye.png", "",
"","","");
ChatRoomMemberList.addStyle($PERSON_IGNORE,
"", "mute_speaker.png",
"","","");
ChatRoomMemberList.addStyle($PERSON_IGNORE | $PERSON_OPERATOR,
"sys_op_eye.png", "mute_speaker.png",
"","","");
ChatRoomMemberList.addStyle($PERSON_AWAY,
"", "",
"128 128 128","","");
ChatRoomMemberList.addStyle($PERSON_OPERATOR | $PERSON_AWAY,
"sys_op_eye.png", "",
"128 128 128","","");
ChatRoomMemberList.addStyle($PERSON_IGNORE | $PERSON_AWAY,
"", "mute_speaker.png",
"128 128 128","","");
ChatRoomMemberList.addStyle($PERSON_IGNORE | $PERSON_OPERATOR | $PERSON_AWAY,
"sys_op_eye.png", "mute_speaker.png",
"128 128 128","","");
}
//------------------------------------------------------------------------------
function ChatRoomMemberList_refresh(%c)
{
ChatRoomMemberList.clear();
for (%i = 0; %i < %c.numMembers(); %i++)
{
ChatRoomMemberList.addRow(%c.getMemberId(%i),%c.getMemberNick(%i));
ChatRoomMemberList.setRowStyle(%i,%c.getMemberId(%i).flags | %c.getFlags(%i));
}
}
//------------------------------------------------------------------------------
function ChannelBannedList_refresh()
{
ChannelBanList.clear();
%j = 0;
for (%i = 0; %i < $IRCClient::numBanned; %i++)
{
%p = $IRCClient::banList[%i];
if (!$IRCClient::removeBan[%p])
{
ChannelBanList.addRow(%p,IRCClient::taggedNick(%p));
ChannelBanList.setRowStyle(%j,%p.flags);
%j++;
}
}
ChannelBanList.sort(0);
}
//------------------------------------------------------------------------------
function ChannelRemoveBan()
{
$IRCClient::removeBan[ChannelBanList.getSelectedId()] = true;
ChannelBannedList_refresh();
}
//------------------------------------------------------------------------------
function ChatRoomMemberList::onRightMouseDown(%this,%column,%row,%mousePos)
{
// Open the action menu:
ChatMemberPopup.member = %this.getRowId(%row);
ChatMemberPopup.position = %mousePos;
ChatMemberPopup.clear();
%nick = IRCClient::displayNick(ChatMemberPopup.member);
%is = $IRCClient::currentChannel.findMember(ChatMemberPopup.member);
%im = $IRCClient::currentChannel.findMember($IRCClient::people.getObject(0));
// if ( !ChatMember.player.isBot )
ChatMemberPopup.add(%nick,-1);
for (%i = 0; %i < strlen(%nick) * 1.5; %i++)
%line = %line @ "-";
ChatMemberPopup.add(%line,-1);
if (ChatMemberPopup.member == $IRCClient::people.getObject(0))
{
if (ChatMemberPopup.member.flags & $PERSON_AWAY)
ChatMemberPopup.add("Set Present",0);
else
ChatMemberPopup.add("Set Away",1);
}
else
{
if (strcmp(ChatMemberPopup.member.displayName,$IRCClient::currentChannel.getName()))
ChatMemberPopup.add("Chat",2);
if ($IRCClient::currentChannel.getFlags(%im) & $PERSON_OPERATOR)
{
if (strlen(ChatMemberPopup.member.nick) &&
!($IRCClient::currentChannel.getFlags(%is) & $PERSON_OPERATOR))
ChatMemberPopup.add("Admin",3);
ChatMemberPopup.add("Kick",4);
ChatMemberPopup.add("Ban",5);
}
if (ChatMemberPopup.member.flags & $PERSON_IGNORE)
ChatMemberPopup.add("Unmute",6);
else
ChatMemberPopup.add("Mute",6);
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.private)
continue;
%cis = %c.findMember(ChatMemberPopup.member);
%cim = %c.findMember($IRCClient::people.getObject(0));
if (%cis < 0 &&
(!(%c.flags & $CHANNEL_INVITE) ||
%c.getFlags(%cim) & $PERSON_OPERATOR))
ChatMemberPopup.add("Invite to" SPC IRCClient::displayChannel(%c.getName()),%c);
}
}
Canvas.pushDialog(ChatMemberActionDlg);
ChatMemberPopup.forceOnAction();
}
//------------------------------------------------------------------------------
function ChatPrivate()
{
if (ChatRoomMemberList.getSelectedId() != $IRCClient::people.getObject(0))
{
%c = IRCClient::findChannel(ChatRoomMemberList.getSelectedId().getName(),true);
ChatTabView.setSelected(%c);
}
}
//------------------------------------------------------------------------------
function ChatMemberPopup::onSelect(%this,%id,%text)
{
switch( %id )
{
case 0: // Set Back
IRCClient::away("");
case 1: // Set Away
IRCClient::away($pref::IRCClient::awaymsg);
case 2: // Chat
%c = IRCClient::findChannel(ChatMemberPopup.member.displayName,true);
ChatTabView.setSelected(%c);
case 3: // Admin
IRCClient::setOperator(ChatMemberPopup.member);
case 4: // Kick
IRCClient::kick(ChatMemberPopup.member,$pref::IRCClient::kickmsg);
case 5: // Ban
IRCClient::ban(ChatMemberPopup.member,true);
IRCClient::kick(ChatMemberPopup.member,$pref::IRCClient::banmsg);
case 6: // Mute/Unmute
IRCClient::ignore(ChatMemberPopup.member,!(ChatMemberPopup.member.flags & $PERSON_IGNORE));
default: // Invite
IRCClient::invite(ChatMemberPopup.member,%id);
}
}
//------------------------------------------------------------------------------
function ChannelBanList::onAdd(%this)
{
ChannelBanList.addStyle($PERSON_IGNORE,
"", "mute_speaker.png",
"","","");
ChannelBanList.addStyle($PERSON_AWAY,
"", "",
"128 128 128","","");
ChannelBanList.addStyle($PERSON_IGNORE | $PERSON_AWAY,
"", "mute_speaker.png",
"128 128 128","","");
}
//------------------------------------------------------------------------------
function ChatGui::onClose(%key)
{
if ($IRCClient::people.getObject(0).flags & $PERSON_AWAY)
IRCClient::away("");
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
IRCClient::part($IRCClient::channels.getObject(%i).getName());
}
//------------------------------------------------------------------------------
function ChatGui::onSleep(%this)
{
ChatGui.awake = false;
$IRCClient::attachedChannel = 0;
Canvas.popDialog(LaunchToolbarDlg);
}
//------------------------------------------------------------------------------
function EditChannelOptions()
{
%c = $IRCClient::currentChannel;
ChannelOptionsDlg.channel = %c;
%im = $IRCClient::currentChannel.findMember($IRCClient::people.getObject(0));
EditChannelName.setValue(IRCClient::displayChannel(%c.getName()));
IRCClient::requestBanList($IRCClient::currentChannel);
EditChannelTopic.setValue(%c.topic);
$EditChannelInvite = %c.flags & $CHANNEL_INVITE;
ButtonChannelInvite.setActive(!%c.tribe);
$EditChannelModerate = %c.flags & $CHANNEL_MODERATED;
$EditChannelLimit = %c.flags & $CHANNEL_LIMITED;
ButtonChannelLimit.setActive(!%c.tribe && !$EditChannelInvite);
if ($EditChannelLimit)
{
EditChannelMaxMembers.setValue(%c.personLimit);
EditChannelMaxMembers.setActive(!%c.tribe && !$EditChannelInvite);
}
else
EditChannelMaxMembers.setActive(false);
$EditChannelKey = %c.flags & $CHANNEL_HAS_KEY;
ButtonChannelKey.setActive(!%c.tribe);
if ($EditChannelKey)
{
EditChannelPassword.setValue(%c.key);
EditChannelPassword.setActive(!%c.tribe);
}
else
EditChannelPassword.setActive(false);
Canvas.pushDialog(ChannelOptionsDlg);
}
//------------------------------------------------------------------------------
function ToggleChannelInvite()
{
if ($EditChannelInvite)
{
ButtonChannelLimit.setActive(false);
EditChannelMaxMembers.setActive(false);
}
else
{
ButtonChannelLimit.setActive(true);
ToggleChannelLimit();
}
}
//------------------------------------------------------------------------------
function ToggleChannelLimit()
{
EditChannelMaxMembers.setActive($EditChannelLimit);
}
//------------------------------------------------------------------------------
function ToggleChannelKey()
{
EditChannelPassword.setActive($EditChannelKey);
}
//------------------------------------------------------------------------------
function CancelChannelOptions()
{
Canvas.popDialog(ChannelOptionsDlg);
// remove temporarily created people
for (%i = 0; %i < $IRCClient::numBanned; %i++)
{
%p = $IRCClient::banList[%i];
if (!%p.ref)
{
$IRCClient::people.remove(%p);
%p.delete();
}
}
}
//------------------------------------------------------------------------------
function AcceptChannelOptions()
{
Canvas.popDialog(ChannelOptionsDlg);
%c = ChannelOptionsDlg.channel;
// undo bans and remove temporarily created people
for (%i = 0; %i < $IRCClient::numBanned; %i++)
{
%p = $IRCClient::banList[%i];
if ($IRCClient::removeBan[%p])
IRCClient::ban(%p,false);
if (!%p.ref)
{
$IRCClient::people.remove(%p);
%p.delete();
}
}
%t = EditChannelTopic.getValue();
if (strcmp(%t,%c.topic))
IRCClient::topic(%c,%t);
if ($EditChannelInvite != (%c.flags & $CHANNEL_INVITE))
IRCClient::setInvite(%c,$EditChannelInvite);
if ($EditChannelModerate != (%c.flags & $CHANNEL_MODERATED))
IRCClient::setModerate(%c,$EditChannelModerate);
if ($EditChannelLimit)
{
%l = EditChannelMaxMembers.getValue();
if (!(%c.flags & $CHANNEL_LIMITED) || %l != %c.personLimit)
IRCClient::setLimit(%c,true,%l);
}
else
if (%c.flags @ $CHANNEL_LIMITED)
IRCClient::setLimit(%c,false,0);
if ($EditChannelKey)
{
%k = EditChannelPassword.getValue();
if (!(%c.flags & $CHANNEL_HAS_KEY) || strcmp(%k,%c.key))
IRCClient::setKey(%c,true,%k);
}
else
if (%c.flags & $CHANNEL_HAS_KEY)
IRCClient::setKey(%c,false,"");
}
//========================================================================
// chat options menu
//------------------------------------------------------------------------------
function EditChatOptions()
{
$tempHighlightOn = $pref::IRCClient::HightlightOn;
ButtonChatHighlight.setValue($tempHighlightOn);
$tempHideLinks = $pref::IRCClient::hideLinks;
ButtonChatNameLinkToggle.setValue($tempHideLinks);
//for now
ButtonChatShowJoin.setVisible(false);
ButtonChatChannelHighlight.setVisible(false);
EditChatAwayMessage.setValue($pref::IRCClient::awaymsg);
EditChatKickMessage.setValue($pref::IRCClient::kickmsg);
EditChatBanMessage.setValue($pref::IRCClient::banmsg);
Canvas.pushDialog(ChatOptionsDlg);
}
//------------------------------------------------------------------------------
function acceptChatOptions()
{
//error("Accepting Chat Options....");
$pref::IRCClient::HighlightOn = $tempHighlightOn;
$pref::IRCClient::hideLinks = $tempHideLinks;
if($tempAwayMsg !$= "")
$pref::IRCClient::awaymsg = $tempAwayMsg;
else
$pref::IRCClient::awaymsg = $DefaultChatAwayMessage;
if($tempkickmsg !$= "")
$pref::IRCClient::kickmsg = $tempkickmsg;
else
$pref::IRCClient::kickmsg = $DefaultChatKickMessage;
if($tempbanmsg !$= "")
$pref::IRCClient::banmsg = $tempbanmsg;
else
$pref::IRCClient::banmsg = $DefaultChatBanMessage;
canvas.popDialog(ChatOptionsDlg);
}
//------------------------------------------------------------------------------
function CancelChatOptions()
{
canvas.popDialog(ChatOptionsDlg);
}
//------------------------------------------------------------------------------
function ToggleChatHiglight()
{
$tempHighlightOn = !$tempHighlightOn;
ButtonChatHighlight.setValue($tempHighlightOn);
}
//------------------------------------------------------------------------------
function ToggleChatLinkedNicks()
{
$tempHideLinks = !$tempHideLinks;
ButtonChatNameLinkToggle.setValue($tempHideLinks);
}
//------------------------------------------------------------------------------
function IRCClient::init()
{
$IRCClient::tcp = new TCPObject(IRCTCP);
$IRCClient::people = new SimGroup(IRCPeople);
$IRCClient::channels = new SimGroup(IRCChannels);
$IRCClient::connectwait = 0;
$IRCClient::room = "";
$IRCClient::numCensorWords = 0;
$IRCClient::previousChannelCount = 0;
$IRCClient::people.add(new SimObject()
{
real = "";
identity = "";
nick = "";
flags = 0;
ping = 0;
ref = 1;
});
$IRCClient::channels.add(new ChannelVector($CHANNEL_STATUS)
{
topic = "IRC Status";
key = "";
flags = 0;
personLimit = 0;
private = false;
tribe = false;
});
}
//------------------------------------------------------------------------------
function IRCClient::notify(%event)
{
switch$(%event)
{
case IDIRC_CONNECTING_SOCKET:
case IDIRC_CONNECTED:
IRCClient::requestChannelList();
case IDIRC_ERR_HOSTNAME:
MessageBoxOK("Bad Hostname","Could not resolve IRC server address " @ $IRCClient::server @ ".","");
case IDIRC_ERR_TIMEOUT:
MessageBoxOK("No Response","Connection failed. The IRC server did not respond.","");
case IDIRC_ERR_DROPPED:
MessageBoxOK("Connection Dropped","You have been disconnected from IRC server " @ $IRCClient::server @ ".","");
case IDIRC_ERR_BADCHALLENGE:
case IDIRC_ERR_BADCHALRESP_REPLY:
case IDIRC_CHANNEL_LIST:
JoinChatList.clear();
for (%i = 0; %i < $IRCClient::numChannels; %i++)
JoinChatList.addRow(%i,IRCClient::displayChannel($IRCClient::channelNames[%i]));
JoinChatList.sort(0);
if (strlen(JoinChatName.getValue()))
{
%i = JoinChatList.findTextIndex(JoinChatName.getValue());
JoinChatList.scrollVisible(%i);
JoinChatList.setSelectedById(JoinChatList.getRowId(%i));
}
case IDIRC_CHANNEL_HAS_KEY:
KeyChannelName.setValue(IRCClient::displayChannel($IRCClient::keyChannel));
Canvas.pushDialog(ChannelKeyDlg);
case IDIRC_ADDCHANNEL:
if (ChatTabView.tabCount() < $IRCClient::channels.getCount())
ChatTabView.addTab($IRCClient::nextChannel,
IRCClient::displayChannel($IRCClient::nextChannel.getName()),
$IRCClient::nextChannel.private);
if ($IRCClient::nextChannel && !$IRCClient::nextChannel.private)
{
ChatTabView.setSelected($IRCClient::nextChannel);
$IRCClient::nextChannel = 0;
}
alxPlay(sButtonDown,0,0,0);
case IDIRC_JOIN:
%i = $IRCClient::currentChannel.findMember($IRCClient::people.getObject(0));
ChatEditChannelBtn.setVisible($IRCClient::currentChannel.getFlags(%i) & $PERSON_OPERATOR);
ChatRoomMemberList_refresh($IRCClient::currentChannel);
case IDIRC_SORT:
%i = $IRCClient::currentChannel.findMember($IRCClient::people.getObject(0));
ChatEditChannelBtn.setVisible($IRCClient::currentChannel.getFlags(%i) & $PERSON_OPERATOR);
ChatRoomMemberList_refresh($IRCClient::currentChannel);
case IDIRC_PART:
ChatRoomMemberList_refresh($IRCClient::currentChannel);
case IDIRC_KICK:
if ($IRCClient::nextChannel)
{
$IRCClient::attachedChannel = 0;
ChatTabView.setSelected($IRCClient::nextChannel);
$IRCClient::nextChannel = 0;
}
ChatTabView.removeTab($IRCClient::deletedChannel);
case IDIRC_INVITED:
MessageBoxOKCancel("Invite",
"You have been invited to channel " @
IRCClient::displayChannel($IRCClient::invitechannel) @
" by " @ $IRCClient::inviteperson @ ".",
"IRCClient::join($IRCClient::invitechannel);");
case IDIRC_BAN_LIST:
ChannelBannedList_refresh();
case IDIRC_TOPIC:
ChatChannelTopic.setValue($IRCClient::currentChannel.topic);
case IDIRC_DELCHANNEL:
if ($IRCClient::nextChannel)
{
$IRCClient::attachedChannel = 0;
ChatTabView.setSelected($IRCClient::nextChannel);
$IRCClient::nextChannel = 0;
}
ChatTabView.removeTab($IRCClient::deletedChannel);
default:
echo("IRCClient: [NOTIFY] " @ %event);
}
}
//------------------------------------------------------------------------------
function IRCClient::statusMessage(%message)
{
$IRCClient::channels.getObject(0).pushBackLine("[STATUS] " @ %message);
}
//------------------------------------------------------------------------------
function IRCClient::connecting()
{
$IRCClient::connectwait++;
if ($IRCClient::connectwait > 1)
return;
ChatChannelPane.setTitle("CONNECTING");
JoinChatPane.setTitle("CONNECTING");
ChannelBanPane.setTitle("CONNECTING");
}
//------------------------------------------------------------------------------
function IRCClient::connected()
{
if (!$IRCClient::connectwait)
return;
$IRCClient::connectwait--;
if ($IRCClient::connectwait)
return;
ChatChannelPane.setTitle("CHAT");
JoinChatPane.setTitle("CHOOSE CHAT CHANNEL");
ChannelBanPane.setTitle("EDIT BAN LIST");
}
//------------------------------------------------------------------------------
function IRCClient::newMessage(%channel,%message)
{
if (%channel == $IRCClient::channels.getObject(0) ||
%channel $= "")
$IRCClient::channels.getObject(0).pushBackLine(%message);
else
%channel.pushBackLine(%message);
}
//------------------------------------------------------------------------------
function IRCClient::findPerson(%nick)
{
for (%i = 0; %i < $IRCClient::people.getCount(); %i++)
{
%person = $IRCClient::people.getObject(%i);
if (%person.displayName $= %nick)
return %person;
}
}
//------------------------------------------------------------------------------
function IRCClient::findPerson2(%prefix,%create)
{
// typical name
// Yakuza|!yakuzasama@pool032-max7.ds23-ca-us.dialup.earthlink.net
%prefix = nextToken(%prefix,nick," !");
nextToken(%prefix,ident," ");
if (strlen(%nick))
{
if (getSubStr(%nick,0,1) $= "@" || getSubStr(%nick,0,1) $= "+")
%nick = getSubStr(%nick,1,strlen(%nick)-1);
if (strlen(%ident) && getSubStr(%ident,0,1) $= "~")
%ident = getSubStr(%ident,1,strlen(%ident)-1);
// look 'em up
%p = IRCClient::findPerson(%nick);
if (%p)
{
if (strlen(%ident) && strcmp(%ident,%p.identity))
{
IRCClient::setIdentity(%p,%ident);
IRCClient::correctNick(%p);
}
return %p;
}
if (%create)
{
%p = new SimObject()
{
real = "";
identity = "";
nick = "";
flags = 0;
ping = 0;
ref = 0;
displayName = %nick;
};
IRCClient::setIdentity(%p,%ident);
$IRCClient::people.add(%p);
%c = IRCClient::findChannel(%nick);
if (%c && %c.numMembers != 2)
{
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ " has reconnected.");
%c.addMember(%p,IRCClient::taggedNick(%p));
%p.ref++;
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_JOIN);
}
// initiate WHO do determine username
//if (!strlen(%ident) && %p != $IRCClient::people.getObject(1) &&
//getSubStr(%nick,strlen(%nick)-1,1) $= "^")
//IRCClient::whois(%p);
return %p;
}
}
}
//------------------------------------------------------------------------------
function IRCClient::doEscapes(%string)
{
// escape spaces
while ((%i = strpos(%string," ")) != -1)
%string = getSubStr(%string,0,%i) @ $ESCAPE_SEQ @ "01" @
getSubStr(%string,%i+1,strlen(%string)-(%i+1));
return %string;
}
//------------------------------------------------------------------------------
function IRCClient::undoEscapes(%string)
{
%esclen = strlen($ESCAPE_SEQ);
%offset = 0;
%search = %string;
while ((%i = strpos(%search,$ESCAPE_SEQ)) != -1)
{
%code = getSubStr(%search,%i+%esclen,2);
switch$(%code)
{
case "01":
%replace = " ";
}
%string = getSubStr(%string,0,%offset+%i) @ %replace @
getSubStr(%string,%offset+%i+%esclen+2,
strlen(%string)-(%offset+%i+%esclen+2));
%search = getSubStr(%string,%offset,strlen(%string)-%offset);
}
return %string;
}
//------------------------------------------------------------------------------
function IRCClient::setIdentity(%p,%ident)
{
%p.identity = %ident;
%nick = %p.displayName;
if (strpos(%nick, "^") != -1)
{
%triple = IRCGetTriple(%nick);
%name = getField(%triple, 0);
%tag = getField(%triple, 1);
%append = getField(%triple, 2);
%p.untagged = %name;
if (%tag $= "")
{
%p.nick = %name;
%p.tagged = "<tribe:0>" @ %name @ "</tribe>";
}
else
if(%append)
{
%p.nick = %name @ %tag;
%p.tagged = "<tribe:0>" @ %name @ "</tribe><tribe:1>" @ %tag @ "</tribe>";
}
else
{
%p.nick = %tag @ %name;
%p.tagged = "<tribe:1>" @ %tag @ "</tribe><tribe:0>" @ %name @ "</tribe>";
}
}
else
{
%p.tagged = %nick;
}
}
//------------------------------------------------------------------------------
function IRCClient::displayNick(%person)
{
// identity is set and user is WON-authenticated
if (strlen(%person.nick))
return %person.nick;
else
return %person.displayName;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function IRCClient::taggedNick(%person)
{
//error("IRCClient::taggedNick( "@%person@" )");
// identity is set and user is WON-authenticated
if (strlen(%person.nick))
if($pref::IRCClient::hideLinks)
return %person.nick;
else
return %person.tagged;
else
return %person.displayName;
}
//------------------------------------------------------------------------------
function IRCClient::correctNick(%p)
{
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.getName() $= %p.displayName)
{
ChatTabView.setTabText(%c,IRCClient::displayNick(%p));
%c.topic = "Private chat with" SPC IRCClient::displayNick(%p);
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_TOPIC);
}
%mi = %c.findMember(%p);
if (%mi >= 0)
{
%c.setMemberNick(%mi,IRCClient::taggedNick(%p));
%c.sort();
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_SORT);
}
else
if (%c == $IRCClient::banChannel)
IRCClient::notify(IDIRC_BAN_LIST);
}
}
//------------------------------------------------------------------------------
function IRCClient::findChannel(%name,%create)
{
//error("IRCClient::findChannel( "@%name@", "@%create@" )");
if(%name $= "")
return $IRCClient::currentChannel;
for (%i = 0; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.getName() $= %name)
return %c;
}
if (%create)
{
%topic = "";
%flags = $CHANNEL_NEW;
%private = false;
for (%i = 0; %i < $IRCClient::numChannels; %i++)
if (%name $= $IRCClient::channelNames[%i])
{
%topic = $IRCClient::channelTopics[%i];
break;
}
if (strcmp(getSubStr(%name,0,1),"#") && strcmp(getSubStr(%name,0,1),"&"))
{
%p = IRCClient::findPerson(%name);
%topic = "Private chat with " @ IRCClient::displayNick(%p);
%flags = %flags | $CHANNEL_PRIVATE;
%private = true;
}
%l = strlen(%name);
%tribe = (%l > 7 && strcmp(getSubStr(%name,%l-7,7),"_Public") == 0) ||
(%l > 8 && strcmp(getSubStr(%name,%l-8,8),"_Private") == 0);
%c = new ChannelVector(%name)
{
topic = %topic;
key = $IRCClient::key;
flags = $CHANNEL_NEW;
personLimit = 0;
private = %private;
tribe = %tribe;
};
$IRCClient::channels.add(%c);
if (%c.private)
{
%me = $IRCClient::people.getObject(0);
%c.addMember(%me,IRCClient::taggedNick(%me));
%me.ref++;
%c.addMember(%p,IRCClient::taggedNick(%p));
%p.ref++;
$IRCClient::nextChannel = %c;
IRCClient::notify(IDIRC_ADDCHANNEL);
}
else
{
%messages = %name @ "_messages";
if (isobject(%messages))
{
for (%i = 0; %i < %messages.getNumLines(); %i++)
%c.pushBackLine(%messages.getLineText(%i));
%messages.delete();
}
}
return %c;
}
}
//------------------------------------------------------------------------------
function IRCClient::displayChannel(%channel)
{
if (getSubStr(%channel,0,1) $= "#" || getSubStr(%channel,0,1) $= "&")
return IRCClient::undoEscapes(getSubStr(%channel,1,strlen(%channel)-1));
else
return IRCClient::displayNick(IRCClient::findPerson(%channel));
}
//------------------------------------------------------------------------------
function IRCClient::channelName(%channel)
{
%channel = IRCClient::doEscapes(%channel); // escape spaces
if (getSubStr(%channel,0,1) $= "#")
return %channel;
else
return "#" @ %channel;
}
//------------------------------------------------------------------------------
function IRCClient::reset()
{
$IRCClient::numBanned = 0;
// Delete all the channels except status
$IRCClient::numChannels = 0;
while ($IRCClient::channels.getCount() > 1)
{
%channel = $IRCClient::channels.getObject(1);
$IRCClient::channels.remove(%channel);
%channel.delete();
}
$IRCClient::currentChannel = $IRCClient::channels.getObject(0);
// Delete everyone except myself
while ($IRCClient::people.getCount() > 1)
{
%person = $IRCClient::people.getObject(1);
$IRCClient::people.remove(%person);
%person.delete();
}
}
//------------------------------------------------------------------------------
function IRCClient::connect()
{
if (strcmp($IRCClient::state,IDIRC_CONNECTING_WAITING))
{
IRCClient::disconnect();
if($IRCClient::retries == -1 || $IRCClient::retries > 5)
{
$IRCClient::serverIndex++;
if ($IRCClient::serverIndex >= $IRCClient::serverCount)
$IRCClient::serverIndex = 0;
$IRCClient::serverAttempt++;
if ($IRCClient::serverCount == 0 || $IRCClient::serverAttempt > $IRCClient::serverCount)
{
IRCClient::newMessage("","Unable to connect to IRC servers.");
IRCClient::notify(IDIRC_ERR_TIMEOUT);
$IRCClient::state = IDIRC_DISCONNECTED;
$IRCClient::retries = -1;
if($IRCClient::serverCount > 1)
$IRCClient::serverIndex = getRandom($IRCClient::serverCount-1)-1;
else
$IRCClient::serverIndex = -1;
$IRCClient::serverAttempt = 0;
return;
}
else
$IRCClient::retries = 0;
$IRCClient::server = getField(getRecord($IRCClient::serverList, $IRCClient::serverIndex), 0);
}
IRCClient::newMessage("","Connecting to " @ $IRCClient::server);
$IRCClient::state = IDIRC_CONNECTING_SOCKET;
IRCClient::notify(IDIRC_CONNECTING_SOCKET);
$IRCClient::tcp.connect($IRCClient::server);
}
}
//------------------------------------------------------------------------------
function IRCClient::connect2(%address,%port)
{
$IRCClient::server = %address @ ":" @ %port;
IRCClient::connect();
}
//------------------------------------------------------------------------------
function IRCTCP::onConnected(%this)
{
IRCClient::newMessage("","Established TCP/IP connection");
%me = $IRCClient::people.getObject(0);
IRCClient::send("CERT " @ WONLoginIRC());
$IRCClient::state = IDIRC_CONNECTING_WAITING;
}
//------------------------------------------------------------------------------
function IRCTCP::onDNSFailed(%this)
{
IRCClient::newMessage("","Could not resolve address " @ $IRCClient::server @ ".");
$IRCClient::state = IDIRC_DISCONNECTED;
IRCClient::notify(IDIRC_ERR_HOSTNAME);
}
//------------------------------------------------------------------------------
function IRCTCP::onConnectFailed(%this)
{
if ($IRCClient::state $= IDIRC_CONNECTED)
{
IRCClient::newMessage("","You have been disconnected from " @ $IRCClient::server @ ".");
if (!IRCClient::reconnect())
{
$IRCClient::state = IDIRC_DISCONNECTED;
IRCClient::notify(IDIRC_ERR_DROPPED);
}
}
else
{
IRCClient::newMessage("","Connection failed. The server did not respond.");
$IRCClient::retries++;
IRCClient::connect();
}
}
//------------------------------------------------------------------------------
function IRCClient::reconnect()
{
if (!$pref::IRCClient::autoreconnect)
return (false);
%i = 0;
while ($IRCClient::channels.getCount() > 1)
{
%c = $IRCClient::channels.getObject(1);
if (%c.private)
{
%c.delete();
$IRCClient::deletedChannel = %c;
if ($IRCClient::currentChannel == %c)
$IRCClient::nextChannel = $IRCClient::channels.getObject(0);
IRCClient::notify(IDIRC_DELCHANNEL);
continue;
}
$IRCClient::previousChannel[%i] = %c.getName();
$IRCClient::previousKey[%i] = %c.key;
%messages = $IRCClient::previousChannel[%i] @ "_messages";
if (isobject(%messages))
%messages.delete();
%m = new MessageVector(%messages);
for (%j = 0; %j < %c.getNumLines(); %j++)
%m.pushBackLine(%c.getLineText(%j));
$IRCClient::channels.remove(%c);
for (%j = 0; %j < %c.numMembers(); %j++)
{
%m = %c.getMemberId(%j);
%m.ref--;
if (%m.ref == 0)
{
$IRCClient::people.remove(%m);
%m.delete();
}
}
%c.delete();
$IRCClient::deletedChannel = %c;
if ($IRCClient::currentChannel == %c)
$IRCClient::nextChannel = $IRCClient::channels.getObject(0);
IRCClient::notify(IDIRC_DELCHANNEL);
%i++;
}
$IRCClient::previousChannelCount = %i;
IRCClient::newMessage("","Attempting to reconnect.");
$IRCClient::retries++;
IRCClient::connect();
return true;
}
//------------------------------------------------------------------------------
function IRCClient::disconnect()
{
if ($IRCClient::awaytimeout)
{
cancel($IRCClient::awaytimeout);
$IRCClient::awaytimeout = 0;
}
$IRCClient::state = IDIRC_DISCONNECTED;
$IRCClient::tcp.disconnect();
$IRCClient::silentList = 0;
$IRCClient::silentBanList = 0;
IRCClient::reset();
}
//------------------------------------------------------------------------------
function IRCClient::relogin()
{
IRCClient::newMessage("","IRCClient: Reauthentication starting");
IRCClient::send("CERT " @ WONLoginIRC());
}
//------------------------------------------------------------------------------
function IRCClient::send(%message)
{
$IRCClient::tcp.send(%message @ "\r\n");
}
//------------------------------------------------------------------------------
function IRCTCP::onLine(%this,%line)
{
// HACK: Windows 2000 bug. We shouldn't need to do this!
if ($IRCClient::state $= IDIRC_CONNECTING_SOCKET)
IRCTCP::onConnected(%this);
IRCClient::processLine(%line);
}
//------------------------------------------------------------------------------
function IRCClient::processLine(%line)
{
// RFC_1459: Message Packet format
//
// <message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
// <prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
// <command> ::= <letter> { <letter> } | <number> <number> <number>
// <SPACE> ::= ' ' { ' ' }
// <params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ]
//
// <middle> ::= <Any *non-empty* sequence of octets not including SPACE
// or NUL or CR or LF, the first of which may not be ':'>
// <trailing> ::= <Any, possibly *empty*, sequence of octets not including
// NUL or CR or LF>
// <crlf> ::= CR LF
%src = %line;
if($pref::enableBadWordFilter)
%src = filterString(%src);
if (strlen(%src))
{
// check for prefix
if (getSubStr(%src,0,1) $= ":")
%src = nextToken(getSubStr(%src,1,strlen(%src)-1),prefix," ");
// this is the command
%src = nextToken(%src,command," :");
// followed by its params
%src = nextToken(%src,params,"");
if (!IRCClient::dispatch(%prefix,%command,%params))
{
//echo("IRCClient: " @ %command @ " not handled by dispatch!");
//echo("(cmd:) " @ %prefix @ " " @ %command @ " " @ %params);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::dispatch(%prefix,%command,%params)
{
switch$(%command)
{
case "PING":
IRCClient::onPing(%prefix,%params);
case "PONG":
IRCClient::onPong(%prefix,%params);
case "PRIVMSG":
IRCClient::onPrivMsg(%prefix,%params);
case "JOIN":
IRCClient::onJoin(%prefix,%params);
case "NICK":
IRCClient::onNick(%prefix,%params);
case "QUIT":
IRCClient::onQuit(%prefix,%params);
case "ERROR":
IRCClient::onError(%prefix,%params);
case "TOPIC":
IRCClient::onTopic(%prefix,%params);
case "PART":
IRCClient::onPart(%prefix,%params);
case "KICK":
IRCClient::onKick(%prefix,%params);
case "MODE":
IRCClient::onMode(%prefix,%params);
case "AWAY":
IRCClient::onAway(%prefix,%params);
case "NOTICE":
IRCClient::onNotice(%prefix,%params);
case "VERSION":
IRCClient::onVersion(%prefix,%params);
case "ACTION":
IRCClient::onAction(%prefix,%params);
case "INVITE":
IRCClient::onInvite(%prefix,%params);
case "301":
IRCClient::onAwayReply(%prefix,%params);
case "305":
IRCClient::onUnAwayReply(%prefix,%params);
case "306":
IRCClient::onNowAwayReply(%prefix,%params);
case "311":
IRCClient::onWhoisUserReply(%prefix,%params);
case "312":
IRCClient::onWhoisReply(%prefix,%params);
case "318":
IRCClient::onWhoisReply(%prefix,%params);
case "319":
IRCClient::onWhoisReply(%prefix,%params);
case "315":
IRCClient::onEndOfWho(%prefix,%params);
case "317":
IRCClient::onWhoisIdle(%prefix,%params);
case "322":
IRCClient::onList(%prefix,%params);
case "323":
IRCClient::onListEnd(%prefix,%params);
case "324":
IRCClient::onModeReply(%prefix,%params);
case "331":
IRCClient::onNoTopic(%prefix,%params);
case "332":
IRCClient::onTopic(%prefix,%params);
case "341":
IRCClient::onInviteReply(%prefix,%params);
case "352":
IRCClient::onWhoReply(%prefix,%params);
case "353":
IRCClient::onNameReply(%prefix,%params);
case "367":
IRCClient::onBanList(%prefix,%params);
case "368":
IRCClient::onBanListEnd(%prefix,%params);
case "372":
IRCClient::onMOTD(%prefix,%params);
case "376":
IRCClient::onMOTDEnd(%prefix,%params);
case "401":
IRCClient::onNoSuchNick(%prefix,%params);
case "422":
IRCClient::onMOTDEnd(%prefix,%params);
case "433":
IRCClient::onBadNick(%prefix,%params);
case "444":
IRCClient::onNoLogin(%prefix,%params);
case "465":
IRCClient::onServerBanned(%prefix,%params);
case "468":
IRCClient::onInvalidNick(%prefix,%params);
case "471":
IRCClient::onChannelFull(%prefix,%params);
case "473":
IRCClient::onChannelInviteOnly(%prefix,%params);
case "474":
IRCClient::onChannelBanned(%prefix,%params);
case "475":
IRCClient::onBadChannelKey(%prefix,%params);
case "CHALLENGE":
IRCClient::onChallenge(%prefix,%params);
case "CHALRESP_REPLY":
IRCClient::onChalRespReply(%prefix,%params);
case "DBMSG":
HandleDatabaseProxyResponse(%prefix, %params);
default:
return false;
}
return true;
}
//------------------------------------------------------------------------------
function IRCClient::onPing(%prefix,%params)
{
%time = getSimTime();
if ((%time - $IRCClient::lastPinged) >= $PING_FLOOD_TIMEOUT)
{
$IRCClient::lastPinged = %time;
if (strlen(%prefix))
{
nextToken(%prefix,nick,"!");
%p = IRCClient::findPerson(%nick);
if (%p)
if (%p.ping)
{
IRCClient::newMessage($IRCClient::currentChannel,
IRCClient::taggedNick(%p) @ " roundtrip delay: " @ (%time-%p.ping)/1000 @ " seconds.");
%p.ping = 0;
}
else
{
%params = nextToken(%params,nick," :");
nextToken(%params,key," \x01");
IRCClient::send("NOTICE " @ %nick @ " :\x01PING " @ %key);
}
}
else
IRCClient::send("PONG " @ %params);
}
}
//------------------------------------------------------------------------------
function IRCClient::onPong(%prefix,%params)
{
nextToken(%params,nick," ");
%p = IRCClient::findPerson(%nick);
if (%p && %p.ping)
{
IRCClient::newMessage($IRCClient::currentChannel,
IRCClient::taggedNick(%p) @ " roundtrip delay: " @ (getSimTime()-%p.ping)/1000 @ " seconds.");
%p.ping = 0;
}
}
//------------------------------------------------------------------------------
function IRCClient::onJoin(%prefix,%params)
{
%p = IRCClient::findPerson2(%prefix,true);
%c = IRCClient::findChannel(%params,true);
if (%c.addMember(%p,IRCClient::taggedNick(%p)))
{
%p.ref++;
IRCClient::notify(IDIRC_JOIN);
}
if ($pref::IRCClient::showjoinleave && !(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ " has joined the conversation.");
// if this is me then set this as the current channel
if (%p == $IRCClient::people.getObject(0))
{
$IRCClient::nextChannel = %c;
IRCClient::notify(IDIRC_ADDCHANNEL);
IRCClient::send("MODE " @ %c.getName());
}
IRCClient::connected();
}
//------------------------------------------------------------------------------
function IRCClient::onPrivMsg(%prefix,%params)
{
%p = $IRCClient::people.getObject(0);
%params = nextToken(%params,ch," ");
%msg = %params;
// messages always lead with a ':'
if (getSubStr(%msg,0,1) $= ":")
%msg = getSubStr(%msg,1,strlen(%msg)-1);
// should we highlight this message
if($pref::IRCClient::highlightOn)
%msg = IRCClient::nickHighLight(%msg);
%nick = %ch;
if (getSubStr(%ch,0,1) $= "@" || getSubStr(%ch,0,1) $= "+")
%nick = getSubStr(%nick,1,strlen(%nick)-1);
if ( %nick $= %p.displayName)
nextToken(%prefix,ch," !");
if (strcmp(getSubStr(%msg,0,1),"\x01"))
{
// are we IGNORING this person?
%p = IRCClient::findPerson2(%prefix,true);
if (%p && (%p.flags & $PERSON_IGNORE))
return;
%c = IRCClient::findChannel(%ch, true);
if ( !%c )
return;
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ ": " @ %msg);
}
else
{
// otherwise it's a command imbeded inside PRIVMSG (oh great!)
%msg = nextToken(%msg,command," \x01");
IRCClient::dispatch(%prefix,%command,%ch @ ": " @ %msg);
}
}
//------------------------------------------------------------------------------
function IRCClient::onNick(%prefix,%params)
{
%person = IRCClient::findPerson2(%prefix,false);
if (%person)
{
%old = IRCClient::taggedNick(%person);
%person.displayName = %params;
IRCClient::setIdentity(%person,%person.ident);
IRCClient::correctNick(%person);
if (!(%person.flags & $PERSON_IGNORE))
IRCClient::newMessage($IRCClient::currentChannel,%old @ " is now known as " @ IRCClient::taggedNick(%person) @ ".");
}
}
//------------------------------------------------------------------------------
function IRCClient::onQuit(%prefix,%params)
{
%p = IRCClient::findPerson2(%prefix,false);
if (%p)
{
// For every channel
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.removeMember(%p))
{
if (!(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ " has disconnected from IRC.");
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_PART);
}
}
// clean up the Person
$IRCClient::people.remove(%p);
%p.delete();
}
}
//------------------------------------------------------------------------------
function IRCClient::onError(%prefix,%params)
{
IRCClient::newMessage($IRCClient::currentChannel,%params);
IRCClient::notify(IDIRC_ERROR);
IRCClient::disconnect();
}
//------------------------------------------------------------------------------
function IRCClient::onMOTD(%prefix,%params)
{ // command 372
// EXAMPLE :StLouis.MO.US.UnderNet.org 372 homer128 :- ==> Disclaimer/ Rules:
%msg = nextToken(%params,prefix,":");
IRCClient::newMessage($IRCClient::currentChannel,%msg);
}
//------------------------------------------------------------------------------
function IRCClient::onMOTDEnd(%prefix, %params)
{ // command 372
// EXAMPLE :StLouis.MO.US.UnderNet.org 372 homer128 :- ==> Disclaimer/ Rules:
if ($IRCClient::state $= IDIRC_CONNECTING_WAITING)
{
IRCClient::newMessage("","Successfully connected to " @ $IRCClient::server);
$IRCClient::state = IDIRC_CONNECTED;
IRCClient::notify(IDIRC_CONNECTED);
// auto join a room if requested
if (strlen($IRCClient::room))
IRCClient::send("JOIN " @ $IRCClient::room);
}
}
//------------------------------------------------------------------------------
function IRCClient::onNoSuchNick(%prefix,%params)
{
%params = nextToken(%params,me," ");
nextToken(%params,nick," :");
%c = IRCClient::findChannel(%nick);
if (%c && %c.private)
{
%p = IRCClient::findPerson(%nick);
if (%p)
{
if (!(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ " has disconnected from IRC.");
%c.removeMember(%p);
%p.delete();
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_PART);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::onNameReply(%prefix,%params)
{ // command 353
// EXAMPLE homer128 = #Starsiege :homer128 Fusion^WP KM-UnDead Rick-wrk Lord-Star Apoc0410
%params = nextToken(%params,nick," =@");
%me = IRCClient::findPerson(%nick);
if (!%me)
{
echo("IRCClient::onNameReply: My nick should have existed.");
return;
}
// find the end of channel name
%params = nextToken(%params,ch," :");
%c = IRCClient::findChannel(%ch);
if (!%c)
{
echo("IRCClient::onNameReply: This channel should have existed.");
return;
}
// loop through the nick and add them to the channel
while (strlen(%params))
{
%params = nextToken(%params,nick," ");
%p = IRCClient::findPerson2(%nick,true);
%flags = 0;
if (getSubStr(%nick,0,1) $= "@")
%flags = %flags | $PERSON_OPERATOR;
else if (getSubStr(%nick,0,1) $= "+")
%flags = %flags | $PERSON_SPEAKER;
// If it's not me, add them to the channel
if (%p != %me)
{
%c.addMember(%p,IRCClient::taggedNick(%p),%flags);
%p.ref++;
}
// If it is me, just set the flags
else
{
%i = %c.findMember(%p);
if (%i != -1)
%c.setFlags(%i,%flags,true);
}
}
IRCClient::notify(IDIRC_JOIN);
}
//------------------------------------------------------------------------------
function IRCClient::onWhoReply(%prefix, %params)
{
// command 352
// EXAMPLE: :StLouis.MO.US.UnderNet.org 352 homer128 #Starsiege ~DrAwkward 198.74.39.31 los-angeles.ca.us.undernet.org DrAwkward H :3 JR
%params = nextToken(%params,me," ");
%params = nextToken(%params,ch," ");
%params = nextToken(%params,user," ");
%params = nextToken(%params,at," ");
%params = nextToken(%params,server," ");
%params = nextToken(%params,nick," *+@");
%params = nextToken(%params,HG," ");
%params = nextToken(%params,hops," ");
nextToken(%params,real," ");
%p = IRCClient::findPerson(%nick);
if (!%p) return;
if (getSubStr(%user,0,1) $= "~")
%user = getSubStr(%user,1,strlen(%user)-1);
// update person in question
if (strcmp(%p.identity,%user @ "@" @ %at))
{
IRCClient::setIdentity(%p,%user @ "@" @ %at);
IRCClient::correctNick(%p);
}
%p.real = %real;
// Send it to the status channel
IRCClient::newMessage("","WHO " @ IRCClient::taggedNick(%p) @ ": " @ %user @ "@" @ %at @ " (" @ %real @ ") connected to server " @ %server @ ".");
IRCClient::connected();
}
//------------------------------------------------------------------------------
function IRCClient::onEndOfWho(%prefix,%params)
{
IRCClient::notify(IDIRC_END_OF_WHO);
// IRCClient::newMessage("","End of WHO list.");
}
//------------------------------------------------------------------------------
function IRCClient::onPart(%prefix,%params)
{
%p = IRCClient::findPerson2(%prefix,false);
%c = IRCClient::findChannel(%params);
if (%p && %c)
if (%c.removeMember(%p))
{
if ($pref::IRCClient::showjoinleave && !(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage(%c,IRCClient::taggedNick(%p) @ " has left the conversation.");
IRCClient::notify(IDIRC_PART);
%p.ref--;
if (%p.ref == 0)
{
$IRCClient::people.remove(%p);
%p.delete();
}
}
// if this was me parting, clean up the channel
if (%p == $IRCClient::people.getObject(0) && %c)
{
$IRCClient::channels.remove(%c);
for (%i = 0; %i < %c.numMembers(); %i++)
{
%m = %c.getMemberId(%i);
%m.ref--;
if (%m.ref == 0)
{
$IRCClient::people.remove(%m);
%m.delete();
}
}
%c.delete();
$IRCClient::deletedChannel = %c;
if ($IRCClient::currentChannel == %c)
$IRCClient::nextChannel = $IRCClient::channels.getObject(0);
IRCClient::notify(IDIRC_DELCHANNEL);
}
}
//------------------------------------------------------------------------------
function IRCClient::onNoTopic(%prefix,%params)
{
%params = nextToken(%params,channel," ");
%params = nextToken(%params,channel," ");
// Just a message
IRCClient::newMessage($IRCClient::currentChannel,%channel @ ": No topic is set.");
}
//------------------------------------------------------------------------------
function IRCClient::onTopic(%prefix,%params)
{
%params = nextToken(%params,ch," :");
%c = IRCClient::findChannel(%ch);
if (!%c)
{
%params = nextToken(%params,ch," :");
%c = IRCCLient::findChannel(%ch);
}
if (!%c)
return;
%c.topic = %params;
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_TOPIC);
}
//------------------------------------------------------------------------------
function IRCClient::onKick(%prefix,%params)
{
// EXAMPLE: BarbieGrl!Forgot@tsbrk3-204.gate.net KICK #HackPhreak RiseR :0,1 Shitlisted 
nextToken(%prefix,host," !");
%params = nextToken(%params,ch," ");
%params = nextToken(%params,nick," :");
%h = IRCClient::findPerson(%host);
if (%h)
%host = IRCClient::taggedNick(%h);
%c = IRCClient::findChannel(%ch);
%p = IRCClient::findPerson(%nick);
if (%p && %c)
if (%c.removeMember(%p))
{
// was it me?
if (%p == $IRCClient::people.getObject(0))
{
// Delete the channel
for (%i = 0; %i < $IRCClient::channels.getCount(); %i++)
if ($IRCClient::channels.getObject(%i) == %c)
{
$IRCClient::channels.remove(%c);
%c.delete();
$IRCClient::deletedChannel = %c;
if ($IRCClient::currentChannel == %c)
$IRCClient::nextChannel = $IRCClient::channels.getObject(0);
break;
}
IRCClient::statusMessage("Host " @ %host @ " kicks " @ IRCClient::taggedNick(%p) @ " out of the chat room, saying \"" @ %params @ "\"");
IRCClient::notify(IDIRC_KICK);
}
else
{
IRCClient::newMessage($IRCClient::currentChannel,"Host " @ %host @ " kicks " @ IRCClient::taggedNick(%p) @ " out of the chat room, saying \"" @ %params @ "\"");
IRCClient::notify(IDIRC_PART);
}
%p.ref--;
if (%p.ref == 0)
{
$IRCClient::people.remove(%p);
%p.delete();
}
}
}
//------------------------------------------------------------------------------
function IRCClient::onModeReply(%prefix,%params)
{
// Strip the person name
%params = nextToken(%params,person," ");
// Send the rest on to the usual handler
IRCClient::onMode(%prefix,%params);
}
//------------------------------------------------------------------------------
function IRCClient::onMode(%prefix,%params)
{
// EXAMPLE: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +v homer128
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +m
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege -m
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +lo 50 nick
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +l 500
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege -l
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +s
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege -s
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege +p
// EXAMPLE: PACKET: :RickO!ricko@rick-266.dynamix.com MODE #starsiege -p
IRCClient::newMessage("",%params);
%params = nextToken(%params,ch," ");
%params = nextToken(%params,mode," ");
%enable = (getSubStr(%mode,0,1) $= "+");
%c = IRCClient::findChannel(%ch);
if (!%c) return;
for (%i = 1; %i < strlen(%mode); %i++)
switch$(getSubStr(%mode,%i,1))
{
// PERSON Mode command
case "o": // Operator
%params = nextToken(%params,arg," ");
%i = (strlen(%arg) ? %c.findMember(IRCClient::findPerson(%arg)) : -1);
if (%i == -1)
break;
%c.setFlags(%i,$PERSON_OPERATOR,%enable);
%c.sort();
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_SORT);
// only display the message if my privilages are modified.
if (strcmp(%arg,$IRCClient::people.getObject(0).displayName))
break;
nextToken(%prefix,arg,"!");
if (%c.getFlags(%i) & $PERSON_OPERATOR)
IRCClient::newMessage(%c,%arg @ " made you an operator.");
else
if (%c.getFlags(%i) & $PERSON_SPEAKER)
IRCClient::newMessage(%c,%arg @ " made you a speaker.");
else
IRCClient::newMessage(%c,%arg @ " made you an spectator.");
case "v": // Speaker (voice)
%params = nextToken(%params,arg," ");
%i = (strlen(%arg) ? %c.findMember(IRCClient::findPerson(%arg)) : -1);
if (%i == -1)
break;
%c.setFlags(%i,$PERSON_SPEAKER,%enable);
%c.sort();
if (%c == $IRCClient::currentChannel)
IRCClient::notify(IDIRC_SORT);
// only display the message if my privilages are modified.
if (strcmp(%arg,$IRCClient::people.getObject(0).displayName))
break;
nextToken(%prefix,arg,"!");
if (%c.getFlags(%i) & $PERSON_OPERATOR)
IRCClient::newMessage(%c,%arg @ " made you an operator.");
else
if (%c.getFlags(%i) & $PERSON_SPEAKER)
IRCClient::newMessage(%c,%arg @ " made you a speaker.");
else
IRCClient::newMessage(%c,%arg @ " made you a spectator.");
// CHANNEL Mode command
case "b": // Ban
%params = nextToken(%params,arg," ");
case "i": // Channel is Invite only
if (%enable)
%c.flags = %c.flags | $CHANNEL_INVITE;
else
%c.flags = %c.flags & ~$CHANNEL_INVITE;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "l": // Channel has limited members
%params = nextToken(%params,arg," ");
%c.personLimit = (%enable ? %arg : 0);
if (%enable)
%c.flags = %c.flags | $CHANNEL_LIMITED;
else
%c.flags = %c.flags & ~$CHANNEL_LIMITED;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "m": // Channel is moderated
if (%enable)
%c.flags = %c.flags | $CHANNEL_MODERATED;
else
%c.flags = %c.flags & ~$CHANNEL_MODERATED;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "n": // External messages are ignored
if (%enable)
%c.flags = %c.flags | $CHANNEL_IGNORE_EXTERN;
else
%c.flags = %c.flags & ~$CHANNEL_IGNORE_EXTERN;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "p": // Channel is Private
if (%enable)
%c.flags = %c.flags | $CHANNEL_PRIVATE;
else
%c.flags = %c.flags & ~$CHANNEL_PRIVATE;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "s": // Channel is Secret
if (%enable)
%c.flags = %c.flags | $CHANNEL_SECRET;
else
%c.flags = %c.flags & ~$CHANNEL_SECRET;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "t": // Channel topic limited to Operators
if (%enable)
%c.flags = %c.flags | $CHANNEL_TOPIC_LIMITED;
else
%c.flags = %c.flags & ~$CHANNEL_TOPIC_LIMITED;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
case "k": // Channel has secret key
%params = nextToken(%params,arg," ");
%c.key = (%enable ? %arg : "");
if (%enable)
%c.flags = %c.flags | $CHANNEL_HAS_KEY;
else
%c.flags = %c.flags & ~$CHANNEL_HAS_KEY;
IRCClient::notify(IDIRC_CHANNEL_FLAGS);
}
}
//------------------------------------------------------------------------------
function IRCClient::onWhoisReply(%prefix,%params)
{
// EXAMPLE :rick-266.dynamix.com 311 homer128 RickO ricko rick-266.dynamix.com 198.74.38.222 :Rick
// EXAMPLE :rick-266.dynamix.com 319 homer128 RickO :@#starsiege
// EXAMPLE :rick-266.dynamix.com 312 homer128 RickO rick-266.dynamix.com :WIRCSRV Windows IRC Server
// $params = nextToken($params,ch," ");
// IRCClient::newMessage("",%params);
}
//------------------------------------------------------------------------------
function IRCClient::onWhoisUserReply(%prefix,%params)
{
%params = nextToken(%params,chunk," ");
%tmp = %params;
%params = nextToken(%params,nick," ");
%params = nextToken(%params,user," ");
%params = nextToken(%params,at," ");
%real = nextToken(%params,chunk,":");
%p = IRCClient::findPerson(%nick);
if (!%p) return;
if (getSubStr(%user,0,1) $= "~")
%user = getSubStr(%user,1,strlen(%user)-1);
// update person in question
if (strcmp(%p.identity,%user @ "@" @ %at))
{
IRCClient::setIdentity(%p,%user @ "@" @ %at);
IRCClient::correctNick(%p);
}
%p.real = %real;
// Send it to the status channel
IRCClient::newMessage("","WHOIS " @ IRCClient::taggedNick(%p) @ ": " @ %user @ "@" @ %at @ " (" @ %real @ ").");
IRCClient::connected();
}
//------------------------------------------------------------------------------
function IRCClient::onWhoisIdle(%prefix,%params)
{
// EXAMPLE :rick-266.dynamix.com 317 homer128 RickO 5350 907453369 :seconds idle
// the date is encoded in '907453369' but I have not figured out how to decode it :(
%params = nextToken(%params,nick," "); // strip out caller's name
%params = nextToken(%params,nick," ");
%params = nextToken(%params,seconds," ");
nextToken(%params,date," ");
%p = IRCClient::findPerson(%nick);
%iMinutes = %seconds/60;
%iSeconds = %seconds%60;
if (%iMinutes)
IRCClient::newMessage("",IRCClient::taggedNick(%p) @ " has been idle for " @ %iMinutes @ " minute(s) and " @ %iSeconds @ " second(s).");
else
IRCCLient::newMessage("",IRCClient::taggedNick(%p) @ " has been idle for " @ %iSeconds @ "second(s).");
}
//------------------------------------------------------------------------------
function IRCClient::censor(%str)
{
if (!strlen(%str))
return false;
if (!$IRCClient::numCensorWords)
if ($IRCClient::censorChannel)
{
%buffer = %str;
%p = strlwr(%buffer);
while (strlen(%p))
{
%p = nextToken(%p,word," ,");
$IRCClient::censorWords[$IRCClient::numCensorWords] = %word;
$IRCClient::numCensorWords++;
}
}
%buffer = %str;
strlwr(%buffer);
for (%i = 0; %i < $IRCClient::numCensorWords; %i++)
if (strstr(%buffer,$IRCClient::censorWords[%i]))
return true;
return false;
}
//------------------------------------------------------------------------------
function IRCClient::onList(%prefix,%params)
{
//EXAMPLE: :StLouis.MO.US.UnderNet.org 322 homer128 #bmx 9 :BMX Rules!
%params = nextToken(%params,nick," ");
%params = nextToken(%params,ch," ");
%topic = nextToken(%params,users," :");
%l = strlen(%ch);
if ((%l > 7 && strcmp(getSubStr(%ch,%l-7,7),"_Public") == 0) ||
(%l > 8 && strcmp(getSubStr(%ch,%l-8,8),"_Private") == 0))
return;
if (IRCClient::censor(%topic))
return;
if ($IRCClient::silentList)
{
$IRCClient::channelNames[$IRCClient::numChannels] = %ch;
$IRCClient::channelTopics[$IRCClient::numChannels] = %topic;
$IRCClient::numChannels++;
}
else
IRCClient::newMessage($IRCClient::currentChannel,%users @ " " @ %ch @ " -- " @ %topic);
}
//------------------------------------------------------------------------------
function IRCClient::onBanList(%prefix,%params)
{
%params = nextToken(%params,banned," ");
%params = nextToken(%params,banned," ");
%params = nextToken(%params,banned," ");
nextToken(%banned,banned,"!*@*");
if ($IRCClient::silentBanList)
{
// temporarily create person
$IRCClient::banList[$IRCClient::numBanned] = IRCClient::findPerson2(%banned,true);
$IRCClient::removeBan[$IRCClient::banList[$IRCClient::numBanned]] = false;
$IRCClient::numBanned++;
}
}
//------------------------------------------------------------------------------
function IRCClient::onListEnd(%prefix,%params)
{
if ($IRCClient::silentList)
{
$IRCClient::silentList = false;
IRCClient::notify(IDIRC_CHANNEL_LIST);
IRCClient::connected();
}
}
//------------------------------------------------------------------------------
function IRCClient::onBanListEnd(%prefix,%params)
{
if ($IRCClient::silentBanList)
{
$IRCClient::silentBanList = false;
IRCClient::notify(IDIRC_BAN_LIST);
IRCClient::connected();
}
}
//------------------------------------------------------------------------------
function IRCClient::onBadNick(%prefix,%params)
{
IRCClient::newMessage("","NOTICE: Nickname (" @ $IRCClient::people.getObject(0).displayName @ ") is already in use.");
IRCClient::notify(IDIRC_ERR_NICK_IN_USE);
}
//------------------------------------------------------------------------------
function IRCClient::onNoLogin(%prefix,%params)
{
%msg = nextToken(%params,cmd," :");
IRCClient::connected();
IRCClient::newMessage("","Could not log in:" SPC %msg);
}
//------------------------------------------------------------------------------
function IRCClient::onAway(%prefix,%params)
{
%msg = nextToken(%params,nick," :");
%p = IRCClient::findPerson(%nick);
if (!%p)
return;
%c = IRCClient::findChannel(%nick);
if (!%c)
return;
if (strlen(%msg))
{
%p.flags = %p.flags | $PERSON_AWAY;
if (!(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage($IRCClient::currentChannel,IRCClient::taggedNick(%p) @ " is away: " @ %msg);
}
else
{
%p.flags = %p.flags & ~$PERSON_AWAY;
if (!(%p.flags & $PERSON_IGNORE))
IRCClient::newMessage($IRCClient::currentChannel,IRCClient::taggedNick(%p) @ " has returned.");
}
if ($IRCClient::currentChannel.findMember(%p) >= 0)
IRCClient::notify(IDIRC_SORT);
}
//------------------------------------------------------------------------------
function IRCClient::onAction(%prefix,%params)
{
%msg = nextToken(%params,ch," :");
%c = IRCClient::findChannel(%ch,true);
%person = IRCClient::findPerson2(%prefix,true);
%name = IRCClient::taggedNick(%person);
IRCClient::newMessage(%c, %name @ " " @ %msg);
}
//------------------------------------------------------------------------------
function IRCClient::onAwayReply(%prefix,%params)
{
//EXAMPLE :rick-266.dynamix.com 301 homer128 RickO :Gone fishing.
%params = nextToken(%params,me," ");
%msg = nextToken(%params,nick," :");
%p = IRCClient::findPerson(%nick);
if (%p)
{
%p.flags = %p.flags | $PERSON_AWAY;
IRCClient::newMessage($IRCClient::currentChannel,IRCClient::taggedNick(%p) SPC "is away:" SPC %msg);
IRCClient::notify(IDIRC_SORT);
}
}
//------------------------------------------------------------------------------
function IRCClient::onUnAwayReply(%prefix,%params)
{
if ($IRCClient::awaytimeout)
cancel($IRCClient::awaytimeout);
$IRCClient::awaytimeout = schedule($AWAY_TIMEOUT,0,"ChatAway_Timeout");
IRCClient::newMessage("","You are no longer marked as being away.");
}
//------------------------------------------------------------------------------
function IRCClient::onNowAwayReply(%prefix,%params)
{
IRCClient::newMessage("","You have been marked as being away.");
}
//------------------------------------------------------------------------------
function IRCClient::onNotice(%prefix,%params)
{
//EXAMPLE NOTICE AUTH :*** Found your hostname
%sender = IRCClient::findPerson2(%prefix,true);
if (!%sender || !(%sender.flags & $PERSON_IGNORE))
{
%msg = strchr(%params,"\x01");
if (!strlen(%msg))
{
// Skip past the target name
%params = nextToken(%params,params,":");
IRCClient::newMessage("","NOTICE FROM " @ IRCClient::taggedNick(%sender) @ ": " @ %params);
}
else
{
// otherwise it's a command imbeded inside NOTICE (oh great!)
%msg = nextToken(%msg,command," \x01");
IRCClient::dispatch(%prefix,%command,%msg);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::onChannelFull(%prefix,%params)
{
%channel = nextToken(%params,channel," ");
nextToken(%channel,channel," ");
IRCClient::connected();
IRCClient::statusMessage("Cannot join " @ %channel @ ": room is full.");
IRCClient::notify(IDIRC_CHANNEL_FULL);
}
//------------------------------------------------------------------------------
function IRCClient::onChannelInviteOnly(%prefix,%params)
{
%channel = nextToken(%params,channel," ");
nextToken(%channel,channel," ");
IRCClient::connected();
IRCClient::statusMessage("Cannot join " @ %channel @ ": room is invite only.");
IRCClient::notify(IDIRC_INVITE_ONLY);
}
//------------------------------------------------------------------------------
function IRCClient::onInvite(%prefix,%params)
{
// Find or create the person (should never be NULL)
%p = IRCClient::findPerson2(%prefix,true);
if (%p)
{
%params = nextToken(%params,channel,":");
%channel = %params;
// Only bother the user if they aren't ignoring this person
if (!(%person.flags & $PERSON_IGNORE))
{
// Set vars and notify the responder
$IRCClient::invitechannel = %channel;
$IRCClient::inviteperson = IRCClient::displayNick(%p);
IRCClient::notify(IDIRC_INVITED);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::onInviteReply(%prefix,%params)
{
%params = nextToken(%params,me," ");
%params = nextToken(%params,person," ");
%params = nextToken(%params,channel," ");
%p = IRCClient::findPerson(%person);
IRCClient::newMessage($IRCClient::currentChannel,"You have invited" SPC IRCClient::taggedNick(%p) SPC "to channel" SPC IRCClient::displayChannel(%channel) @ ".");
}
//------------------------------------------------------------------------------
function IRCClient::onChannelBanned(%prefix,%params)
{
%channel = nextToken(%params,channel," ");
nextToken(%channel,channel," ");
IRCClient::connected();
IRCClient::statusMessage("Cannot join " @ %channel @ ": you have been banned.");
IRCClient::notify(IDIRC_BANNED_CH);
}
//------------------------------------------------------------------------------
function IRCClient::onServerBanned(%prefix,%params)
{
$IRCClient::state = $IDIRC_DISCONNECTED;
IRCClient::statusMessage("You have been banned from this server.");
// IRCClient::notify(IDIRC_BANNED_SERVER);
}
//------------------------------------------------------------------------------
function IRCClient::onInvalidNick(%prefix,%params)
{
$IRCClient::state = IDIRC_DISCONNECTED;
%params = nextToken(%params,name,":");
IRCClient::newMessage("",%params);
}
//------------------------------------------------------------------------------
function IRCClient::onBadChannelKey(%prefix,%params)
{
%channel = nextToken(%params,channel," ");
nextToken(%channel,channel," ");
IRCClient::connected();
IRCClient::statusMessage("Cannot join " @ IRCClient::displayChannel(%channel) @ ": invalid password.");
$IRCClient::keyChannel = %channel;
IRCClient::notify(IDIRC_CHANNEL_HAS_KEY);
}
//------------------------------------------------------------------------------
function IRCClient::onVersion(%prefix,%params)
{
%time = getSimTime();
if ((%time - $IRCClient::lastVersioned) >= $VERSION_FLOOD_TIMEOUT)
{
$IRCClient::lastVersioned = %time;
nextToken(%prefix,nick,"!");
%params = nextToken(%params,msg,": ");
nextToken(%params,msg,"\x01");
%p = IRCClient::findPerson(%nick);
if (%p && strlen(%msg))
IRCClient::newMessage($IRCClient::currentChannel,%nick @ "'s version: " @ %msg @ ".");
else
IRCClient::send("NOTICE " @ %prefix @ " :\x01VERSION " @ $VERSION_STRING @ "\x01");
}
}
//------------------------------------------------------------------------------
function IRCClient::onChallenge(%prefix,%params)
{
%params = nextToken(%params,challenge," ");
%me = $IRCClient::people.getObject(0);
IRCClient::newMessage("","Received WON authentication challenge");
%response = WONLoginIRC(%challenge);
if (strcmp(%challenge,"ERROR"))
IRCClient::send("CHALRESP " @ %response);
else
IRCClient::notify(IDIRC_ERR_BADCHALLENGE);
}
//------------------------------------------------------------------------------
function IRCClient::onChalRespReply(%prefix,%params)
{
%params = nextToken(%params,nick," ");
%params = nextToken(%params,ident," ");
%params = nextToken(%params,reply," ");
%me = $IRCClient::people.getObject(0);
%me.displayName = %nick;
IRCClient::setIdentity(%me,%ident @ "@localhost");
if (WONLoginIRC(%reply) $= "OK")
{
if ($IRCClient::state !$= IDIRC_CONNECTED)
{
IRCClient::newMessage("","Successfully connected to " @ $IRCClient::server);
$IRCClient::state = IDIRC_CONNECTED;
IRCClient::notify(IDIRC_CONNECTED);
if ($IRCClient::awaytimeout)
cancel($IRCClient::awaytimeout);
$IRCClient::awaytimeout = schedule($AWAY_TIMEOUT,0,"ChatAway_Timeout");
// auto join a room if requested
if (strlen($IRCClient::room))
IRCClient::send("JOIN " @ $IRCClient::room);
if ($IRCClient::previousChannelCount > 0)
{
for (%i = 0; %i < $IRCClient::previousChannelCount; %i++)
IRCClient::join($IRCClient::previousChannel[%i] @ " " @ $IRCClient::previousKey[%i]);
$IRCClient::previousChannelCount = 0;
}
}
else
{
IRCClient::newMessage("","Successfully reauthenticated with " @ $IRCClient::server);
IRCClient::correctNick($IRCClient::people.getObject(0));
}
}
else
{
IRCClient::disconnect();
IRCClient::notify(IDIRC_ERR_BADCHALRESP_REPLY);
}
}
//------------------------------------------------------------------------------
function IRCClient::send2(%message,%to)
{
if ((strcmp($IRCCLient::state,IDIRC_CONNECTING_IRC) && strcmp($IRCClient::state,IDIRC_CONNECTED)) ||
!strlen(%message))
return;
if (getSubStr(%message,0,1) $= "/")
{
%buffer = getSubStr(%message,1,strlen(%message)-1);
%params = nextToken(%buffer,command," ");
// dispatch the command to a handler -- if one exists
// we don't need to handle all outgoing commands just a few
switch$(%command)
{
case "PING":
IRCClient::ping(%params);
case "PART":
IRCClient::part(%params);
case "AWAY":
IRCClient::away(%params);
case "ME":
IRCClient::sendAction(%params);
case "ACTION":
IRCClient::sendAction(%params);
case "JOIN":
IRCClient::join(%params);
case "QUIT":
IRCClient::quit(%params);
default:
// otherwise ship it to the server, RAW
IRCClient::send(getSubStr(%message,1,strlen(%message)-1));
}
}
else
if (strlen(%to))
{
IRCClient::send("PRIVMSG " @ %to @ " :" @ %message);
%c = IRCClient::findChannel(%to);
if (%c)
{
%me = $IRCClient::people.getObject(0);
IRCClient::newMessage(%c,IRCClient::taggedNick(%me) @ ": " @ %message);
}
}
else
if (strcmp($IRCClient::currentChannel.getName(),$CHANNEL_STATUS))
{
IRCClient::send("PRIVMSG " @ $IRCClient::currentChannel.getName() @ " :" @ %message);
%me = $IRCClient::people.getObject(0);
IRCClient::newMessage($IRCClient::currentChannel,IRCClient::taggedNick(%me) @ ": " @ %message);
}
}
//------------------------------------------------------------------------------
function IRCClient::sendAction(%message)
{
if (($IRCClient::state != $IDIRC_CONNECTING_IRC && $IRCClient::state != $IDIRC_CONNECTED) ||
!strlen(%message))
return;
if (getSubStr(%message,0,1) $= "/")
IRCClient::send2(%message,"");
else
{
IRCClient::send("PRIVMSG " @ $IRCClient::currentChannel.getName() @ " :\x01ACTION " @ %message @ "\x01");
%me = $IRCClient::people.getObject(0);
IRCClient::newMessage($IRCClient::currentChannel,IRCClient::taggedNick(%me) @ " " @ %message);
}
}
//------------------------------------------------------------------------------
function IRCClient::join(%params)
{
%tmp = nextToken(%params,channel," ");
nextToken(%tmp,key," ");
// Only allow one channel / key combination at a time - no
// comma delimiting
nextToken(%channel,channel,",");
nextToken(%key,key,",");
%c = IRCClient::findChannel(%channel);
if (%c)
{
$IRCClient::nextChannel = %c;
IRCClient::notify(IDIRC_ADDCHANNEL);
}
else
{
$IRCClient::key = %key;
IRCClient::send("JOIN " @ %channel @ " " @ %key);
IRCClient::connecting();
}
}
//------------------------------------------------------------------------------
function IRCClient::quit(%params)
{
IRCClient::send("QUIT");
IRCClient::disconnect();
}
//------------------------------------------------------------------------------
function IRCClient::nick(%nick)
{
if (($IRCClient::state $= IDIRC_CONNECTED || $IRCClient::state $= IDIRC_CONNECTING_IRC) &&
strlen(nick))
{
if (stricmp(%nick, $IRCClient::people.getObject(0).displayName))
IRCClient::send("NICK " @ %nick);
}
else
$IRCClient::people.getObject(0).displayName = %nick;
}
//------------------------------------------------------------------------------
function IRCClient::name(%name)
{
$IRCClient::people.getObject(0).real = %name;
}
//----------------------------------------------------------------------
function IRCClient::nickHighLight(%message)
{
//error("IRCClient::nickHighLight( "@%message@" )");
%nick = $IRCClient::people.getObject(0).untagged;
//%nickLen = strLen(%nick);
// swap in for multiple nick options here
%wordCount = getWordCount(%message);
for(%i = 0; %i < %wordCount; %i++)
{
%word = getWord(%message, %i);
if(%word $= %nick)
{
%message = "\c2" @ %message;
}
}
return %message;
}
//------------------------------------------------------------------------------
function IRCClient::part(%params)
{
nextToken(%params,ch," ");
if (%ch $= $CHANNEL_STATUS)
return;
%c = IRCClient::findChannel(%ch);
if (%c)
for (%i = 0; %i < $IRCClient::channels.getCount(); %i++)
if ($IRCClient::channels.getObject(%i) == %c)
{
if (getSubStr(%ch,0,1) $= "#" || getSubStr(%ch,0,1) $= "&")
IRCClient::send("PART " @ %params);
else
{
$IRCClient::channels.remove(%c);
for (%i = 0; %i < %c.numMembers(); %i++)
{
%m = %c.getMemberId(%i);
%m.ref--;
if (%m.ref == 0)
{
$IRCClient::people.remove(%m);
%m.delete();
}
else
if (%m != $IRCClient::people.getObject(0) &&
(%m.flags & $PERSON_AWAY))
%m.flags = %m.flags & ~$PERSON_AWAY;
}
%c.delete();
$IRCClient::deletedChannel = %c;
if ($IRCClient::currentChannel == %c)
$IRCClient::nextChannel = $IRCClient::channels.getObject(0);
IRCClient::notify(IDIRC_DELCHANNEL);
}
break;
}
}
//------------------------------------------------------------------------------
function IRCClient::away(%params)
{
%me = $IRCClient::people.getObject(0);
if (strlen(%params))
{
if ($IRCClient::awaytimeout)
{
cancel($IRCClient::awaytimeout);
$IRCClient::awaytimeout = 0;
}
%me.flags = %me.flags | $PERSON_AWAY;
IRCClient::send("AWAY :" @ %params);
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.private)
IRCClient::send("PRIVMSG " @ %c.getName() @ " :\x01AWAY :" @ %params @ "\x01");
}
}
else
{
%me.flags = %me.flags & ~$PERSON_AWAY;
IRCClient::send("AWAY");
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (%c.private)
IRCClient::send("PRIVMSG " @ %c.getName() @ " :\x01AWAY \x01");
}
}
IRCClient::notify(IDIRC_SORT);
}
//------------------------------------------------------------------------------
function IRCClient::ping(%params)
{
%params = nextToken(%params,nick," ");
while (strlen(%nick))
{
%p = IRCClient::findPerson(%nick);
if (%p)
{
%p.ping = GetSimTime();
IRCClient::send("PRIVMSG " @ %nick @ " :\x01PING 0\x01");
}
%params = nextToken(%params,nick," ");
}
}
//------------------------------------------------------------------------------
function IRCClient::setOperator(%p)
{
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " +o " @ %p.displayName);
}
//------------------------------------------------------------------------------
function IRCClient::setSpeaker(%nick)
{
if (strcmp($IRCClient::currentChannel.getName(),$CHANNEL_STATUS))
{
%i = $IRCClient::currentChannel.findMember(%nick);
if (%i != -1)
{
if ($IRCClient::currentChannel.getFlags(%i) & $PERSON_OPERATOR)
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " -o " @ %nick);
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " +v " @ %nick);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::setSpectator(%nick)
{
if (strcmp($IRCClient::currentChannel.getName(),$CHANNEL_STATUS))
{
%i = $IRCClient::currentChannel.findMember(%nick);
if (%i != -1)
{
if ($IRCClient::currentChannel.getFlags(%i) & $PERSON_OPERATOR)
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " -o " @ %nick);
if ($IRCClient::currentChannel.getFlags(%i) & $PERSON_SPEAKER)
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " -v " @ %nick);
}
}
}
//------------------------------------------------------------------------------
function IRCClient::kick(%p,%msg)
{
IRCClient::send("KICK" SPC $IRCClient::currentChannel.getName() SPC %p.displayName @ " :" @ %msg);
}
//------------------------------------------------------------------------------
function IRCClient::ban(%p,%add)
{
if (%add)
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " +b " @ %p.displayName);
else
IRCClient::send("MODE " @ $IRCClient::currentChannel.getName() @ " -b " @ %p.displayName);
}
//------------------------------------------------------------------------------
function IRCClient::ignore(%p,%tf)
{
if ($IRCClient::currentChannel.getName() $= $CHANNEL_STATUS)
{
echo("IRCClient::ignore: no current channel.");
return;
}
if (%p)
{
if (%tf)
{
%p.flags = %p.flags | $PERSON_IGNORE;
IRCClient::newMessage("","You are now ignoring " @ IRCClient::taggedNick(%p) @ ".");
}
else
{
%p.flags = %p.flags & ~$PERSON_IGNORE;
IRCClient::newMessage("","You are no longer ignoring " @ IRCClient::taggedNick(%p) @ ".");
}
IRCClient::notify(IDIRC_SORT);
}
}
//------------------------------------------------------------------------------
function IRCClient::invite(%p,%c)
{
IRCClient::send("INVITE" SPC %p.displayName SPC %c.getName());
}
//------------------------------------------------------------------------------
function IRCClient::who(%p)
{
IRCClient::connecting();
IRCClient::send("WHO" SPC %p.displayName);
}
//------------------------------------------------------------------------------
function IRCClient::whois(%p)
{
IRCClient::connecting();
IRCClient::send("WHOIS" SPC %p.displayName);
}
//------------------------------------------------------------------------------
function IRCClient::topic(%c,%t)
{
IRCClient::send("TOPIC" SPC %c.getName() SPC ":" @ %t);
}
//------------------------------------------------------------------------------
function IRCClient::setInvite(%c,%i)
{
if (%i)
IRCClient::send("MODE" SPC %c.getName() SPC "+i");
else
IRCClient::send("MODE" SPC %c.getName() SPC "-i");
}
//------------------------------------------------------------------------------
function IRCClient::setModerate(%c,%m)
{
if (%m)
IRCClient::send("MODE" SPC %c.getName() SPC "+m");
else
IRCClient::send("MODE" SPC %c.getName() SPC "-m");
}
//------------------------------------------------------------------------------
function IRCClient::setLimit(%c,%l,%m)
{
if (%l)
IRCClient::send("MODE" SPC %c.getName() SPC "+l" SPC %m);
else
IRCClient::send("MODE" SPC %c.getName() SPC "-l");
}
//------------------------------------------------------------------------------
function IRCClient::setKey(%c,%k,%p)
{
if (%k)
IRCClient::send("MODE" SPC %c.getName() SPC "+k" SPC %p);
else
IRCClient::send("MODE" SPC %c.getName() SPC "-k");
}
//------------------------------------------------------------------------------
function IRCClient::requestChannelList()
{
// clear the global channel List
$IRCClient::numChannels = 0;
$IRCClient::silentList = true;
IRCClient::send("LIST");
IRCClient::connecting();
}
//------------------------------------------------------------------------------
function IRCClient::requestBanList(%c)
{
// clear the global banned list
$IRCClient::banChannel = %c;
$IRCClient::numBanned = 0;
$IRCClient::silentBanList = true;
IRCClient::send("MODE " @ %c.getName() @ " +b");
IRCClient::connecting();
}
//------------------------------------------------------------------------------
function IRCClient::onJoinServer(%mission,%server,%address,%mayprequire,%prequire)
{
// server and address are required, and we have to be connected
if (strlen(%server) && strlen(%address) && $IRCClient::state == $IDIRC_CONNECTED)
{
%buf = "left to play " @ %mission @ " on server " @ %server @ " [" @ %address @ ":" @ %mayprequire @ %prequire @ "]";
IRCClient::send("PRIVMSG " @ $IRCClient::currentChannel.getName() @ ":\x01ACTION " @ %buf @ "\x01");
IRCClient::newMessage($IRCClient::currentChannel,
IRCClient::taggedNick($IRCClient::people.getObject(0)) @ " " @ %buf);
}
}
//------------------------------------------------------------------------------
function IRCClient::onJoinGame(%address,%desc)
{
if (%address $= "")
%msg = $pref::IRCClient::hostMsg;
else
%msg = "launched into <t2server:" @ %address @ ">" @ %desc @ "</t2server>.";
IRCClient::away(%msg);
for (%i = 1; %i < $IRCClient::channels.getCount(); %i++)
{
%c = $IRCClient::channels.getObject(%i);
if (!%c.private)
IRCClient::send2(%msg,%c.getName());
}
}
//------------------------------------------------------------------------------
function IRCClient::onLeaveGame()
{
IRCClient::away("");
}
if ($LaunchMode $= "Normal")
{
IRCClient::init();
IRCClient::connect();
}