{ Delphi IMC3 Client - Interface with core Based on client code by Samson of Alsherok. $Id: imc3_main.pas,v 1.4 2004/03/14 11:54:22 druid Exp $ } unit imc3_main; interface implementation uses SysUtils, chars, player, commands, dtypes, util, modules, conns, constants, strip, imc3_const, imc3_chan, imc3_mud, imc3_util, imc3_core; type GInterMudModule = class(TInterfacedObject, IModuleInterface) published procedure registerModule(); procedure unregisterModule(); end; var i3: GInterMud; procedure do_i3(ch : GCharacter; param : string); var iterator : GIterator; mud : GMud_I3; channel : GChannel_I3; cmd, arg, s, t : string; i : integer; begin param := one_argument(param, cmd); if (length(cmd) = 0) then begin ch.sendBuffer('Usage: I3 <(dis)connect/status/mudlist/chanlist/chat/listen/tell/locate/beep/who/finger/help>'#13#10); exit; end; if (prep(cmd) = 'DEBUG') then begin if (prep(param) = 'OFF') then begin i3.setDebugLevel(0); ch.sendBuffer('I3 debugging turned off.'#13#10); end else begin i3.setDebugLevel(2); ch.sendBuffer('I3 debugging turned on.'#13#10); end; end else if (prep(cmd) = 'CONNECT') then begin if (i3.isConnected) then begin ch.sendBuffer('Already connected.'#13#10); exit; end; i3.connect(); ch.sendBuffer('Ok.'#13#10); end else if (prep(cmd) = 'DISCONNECT') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; i3.disconnect(); ch.sendBuffer('Ok.'#13#10); end else if (prep(cmd) = 'STATUS') then begin if (not i3.isConnected) then ch.sendBuffer('Not connected.'#13#10) else begin ch.sendBuffer('Connected to ' + i3.connectedRouter.name + ' (' + i3.connectedRouter.ipaddress + ' ' + IntToStr(i3.connectedRouter.port) + ')'#13#10); ch.sendBuffer('Known muds: ' + IntToStr(mudList.size()) + #13#10); ch.sendBuffer('Known channels: ' + IntToStr(chanList.size()) + #13#10); end; end else if (prep(cmd) = 'MUDLIST') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; param := one_argument(param, arg); ch.sendPager(pad_string('Name', 30) + pad_string('Type', 10) + pad_string('Mudlib', 20) + pad_string('Address', 15) + #13#10#13#10); iterator := mudList.iterator(); while (iterator.hasNext()) do begin mud := GMud_I3(iterator.next()); if (prep(arg) = 'UP') and (mud.status >= 0) then continue; case mud.status of -1: ch.sendPager(pad_string(mud.name, 30) + pad_string(mud.mud_type, 10) + pad_string(mud.mudlib, 20) + pad_string(mud.ipaddress + ':' + IntToStr(mud.player_port), 15) + #13#10); 0: ch.sendPager(pad_string(mud.name, 30) + '(down)' + #13#10); else ch.sendPager(pad_string(mud.name, 30) + '(rebooting)' + #13#10); end; end; iterator.Free(); end else if (prep(cmd) = 'CHANLIST') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; ch.sendPager(pad_string('Name', 20) + pad_string('Hosted by', 30) + #13#10#13#10); iterator := chanList.iterator(); while (iterator.hasNext()) do begin channel := GChannel_I3(iterator.next()); ch.sendPager(pad_string(channel.I3_name, 20) + pad_string(channel.host_mud, 30) + #13#10); end; iterator.Free(); end else if (prep(cmd) = 'CHAT') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; param := one_argument(param, arg); if (length(arg) = 0) then begin ch.sendBuffer('Usage: I3 <channel> <message>'#13#10); exit; end; channel := GChannel_I3(chanList.get(arg)); if (channel <> nil) then begin if (length(param) = 0) then begin if (channel.history.Count = 0) then ch.sendBuffer('No history for this channel.'#13#10) else begin ch.sendBuffer('The last ' + IntToStr(channel.history.Count) + ' message(s):'#13#10); for i := 0 to channel.history.Count - 1 do act(AT_REPORT, channel.history[i], false, ch, nil, nil, TO_CHAR); end; exit; end; i3.sendChannelMessage(channel, ch.name, param); end else ch.sendBuffer('Unknown channel, use I3 CHANLIST to view a list of all available channels.'#13#10); end else if (prep(cmd) = 'LISTEN') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 listen [all]/<channel>'#13#10); exit; end; if (prep(param) = 'ALL') then begin iterator := chanList.iterator(); while (iterator.hasNext()) do begin channel := GChannel_I3(iterator.next()); ch.sendBuffer('Listening to ' + channel.I3_name + '.'#13#10); i3.sendChannelListen(ch.name, channel, true); end; iterator.Free(); end else begin channel := GChannel_I3(chanList.get(param)); if (channel <> nil) then begin ch.sendBuffer('Listening to ' + channel.I3_name + '.'#13#10); i3.sendChannelListen(ch.name, channel, true); end else ch.sendBuffer('Unknown channel, use I3 CHANLIST to view a list of all available channels.'#13#10); end; end else if (prep(cmd) = 'LOCATE') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 locate <username>'#13#10); exit; end; ch.sendBuffer('Trying to locate "' + param + '". If you do not got any results within'#13#10); ch.sendBuffer('the next minute, you can safely assume this player is not online.'#13#10); i3.sendLocateRequest(ch.name, param); end else if (prep(cmd) = 'TELL') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; param := one_argument(param, arg); if (length(arg) = 0) then begin ch.sendBuffer('Usage: I3 tell <user@mud> <message>'#13#10); ch.sendBuffer('Usage: I3 tell [on]/[off]'#13#10); exit; end; if (prep(arg) = 'ON') then begin (GPlayer(ch).fields['i3flag'] as GBitVector).removeBit(I3_TELL); ch.sendBuffer('You now send and receive i3tells.'#13#10); exit; end; if (prep(arg) = 'OFF') then begin (GPlayer(ch).fields['i3flag'] as GBitVector).setBit(I3_TELL); ch.sendBuffer('You no longer send and receive i3tells.'#13#10); exit; end; if ((GPlayer(ch).fields['i3flag'] as GBitVector).isBitSet(I3_TELL)) then begin ch.sendBuffer('Your i3tells are turned off.'#13#10); exit; end; if (pos('@', arg) = 0) then begin ch.sendBuffer('You should specify a person and a mud. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; s := right(arg, '@'); t := lowercase(left(arg, '@')); mud := findMud(s); if (mud = nil) then begin ch.sendBuffer('No such mud known. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; if (mud.status >= 0) then begin ch.sendBuffer('Mud is down.'#13#10); exit; end; if (not mud.tell) then begin ch.sendBuffer('Mud does not support the ''tell'' command.'#13#10); exit end; i3.sendTell(ch.name, t, mud, param); ch.sendBuffer(Format('You tell %s@%s: %s', [cap(t), mud.name, param]) + #13#10); end else if (prep(cmd) = 'BEEP') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 beep <user@mud>'#13#10); exit; end; if (pos('@', param) = 0) then begin ch.sendBuffer('You should specify a person and a mud. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; s := right(param, '@'); t := lowercase(left(param, '@')); mud := findMud(s); if (mud = nil) then begin ch.sendBuffer('No such mud known. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; if (mud.status >= 0) then begin ch.sendBuffer('Mud is down.'#13#10); exit; end; if (not mud.beep) then begin ch.sendBuffer('Mud does not support the ''beep'' command.'#13#10); exit end; i3.sendBeep(ch.name, t, mud); ch.sendBuffer(Format('You beep %s@%s.', [cap(t), mud.name]) + #13#10); end else if (prep(cmd) = 'WHO') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 who <mud>'#13#10); exit; end; mud := findMud(param); if (mud = nil) then begin ch.sendBuffer('No such mud known. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; if (mud.status >= 0) then begin ch.sendBuffer('Mud is down.'#13#10); exit; end; if (not mud.who) then begin ch.sendBuffer('Mud does not support the ''who'' command.'#13#10); exit end; i3.sendWhoReq(ch.name, mud); ch.sendBuffer('Ok.'#13#10); end else if (prep(cmd) = 'FINGER') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 finger <user@mud>'#13#10); exit; end; if (pos('@', param) = 0) then begin ch.sendBuffer('You should specify a person and a mud. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; s := right(param, '@'); t := lowercase(left(param, '@')); mud := findMud(s); if (mud = nil) then begin ch.sendBuffer('No such mud known. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; if (mud.status >= 0) then begin ch.sendBuffer('Mud is down.'#13#10); exit; end; if (not mud.finger) then begin ch.sendBuffer('Mud does not support the ''finger'' command.'#13#10); exit end; i3.sendFingerReq(ch.name, t, mud); ch.sendBuffer('Ok.'#13#10); end else if (prep(cmd) = 'MUDINFO') then begin if (not i3.isConnected) then begin ch.sendBuffer('Not connected.'#13#10); exit; end; if (length(param) = 0) then begin ch.sendBuffer('Usage: I3 mudinfo <mud>'#13#10); exit; end; mud := findMud(param); if (mud = nil) then begin ch.sendBuffer('No such mud known. Use "I3 mudlist" to get an overview of the muds available.'#13#10); exit; end; ch.sendBuffer('Information about ' + mud.name + #13#10#13#10); if (mud.status = -1) then ch.sendBuffer('Status : Up'#13#10) else if (mud.status = 0) then ch.sendBuffer('Status : Currently down'#13#10) else ch.sendBuffer('Status : Currently rebooting, back in ' + IntToStr(mud.status) + ' second(s)'#13#10); ch.sendBuffer('MUD port : ' + mud.ipaddress + ' ' + IntToStr(mud.player_port) + #13#10); ch.sendBuffer('Base mudlib: ' + mud.base_mudlib + #13#10); ch.sendBuffer('Mudlib : ' + mud.mudlib + #13#10); ch.sendBuffer('Driver : ' + mud.driver + #13#10); ch.sendBuffer('Type : ' + mud.mud_type + #13#10); ch.sendBuffer('Open status: ' + mud.open_status + #13#10); ch.sendBuffer('Admin : ' + mud.admin_email + #13#10); if (mud.web <> '') then ch.sendBuffer('URL : ' + mud.web + #13#10); if (mud.daemon <> '') then ch.sendBuffer('Daemon : ' + mud.daemon + #13#10); if (mud.time <> '') then ch.sendBuffer('Time : ' + mud.time + #13#10); if (mud.jeamland > 0) then ch.sendBuffer('Jeamland : ' + IntToStr(mud.jeamland) + #13#10); if (mud.banner <> '') then ch.sendBuffer('Banner : ' + mud.banner + #13#10); ch.sendBuffer('Supports : '); if (mud.tell) then ch.sendBuffer('tell, '); if (mud.beep) then ch.sendBuffer('beep, '); if (mud.emoteto) then ch.sendBuffer('emoteto, '); if (mud.who) then ch.sendBuffer('who, '); if (mud.finger) then ch.sendBuffer('finger, '); if (mud.locate) then ch.sendBuffer('locate, '); if (mud.channel) then ch.sendBuffer('channel, '); if (mud.news) then ch.sendBuffer('news, '); if (mud.mail) then ch.sendBuffer('mail, '); if (mud.mfile) then ch.sendBuffer('file, '); if (mud.auth) then ch.sendBuffer('auth, '); if (mud.ucache) then ch.sendBuffer('ucache, '); ch.sendBuffer(#13#10); ch.sendBuffer('Supports : '); if (mud.smtp > 0) then ch.sendBuffer('smtp (port ' + IntToStr(mud.smtp) + '), '); if (mud.http > 0) then ch.sendBuffer('http (port ' + IntToStr(mud.http) + '), '); if (mud.ftp > 0) then ch.sendBuffer('ftp (port ' + IntToStr(mud.ftp) + '), '); if (mud.pop3 > 0) then ch.sendBuffer('pop3 (port ' + IntToStr(mud.pop3) + '), '); if (mud.nntp > 0) then ch.sendBuffer('nntp (port ' + IntToStr(mud.nntp) + '), '); if (mud.rcp > 0) then ch.sendBuffer('rcp (port ' + IntToStr(mud.rcp) + '), '); if (mud.amrcp > 0) then ch.sendBuffer('amrcp (port ' + IntToStr(mud.amrcp) + '), '); ch.sendBuffer(#13#10); end else if (prep(cmd) = 'HELP') then begin ch.sendBuffer('General Usage:'#13#10); ch.sendBuffer('------------------------------------------------'#13#10#13#10); ch.sendBuffer('Chat on a channel : i3 chat <channel> <message>'#13#10); ch.sendBuffer('Direct tell : i3 tell <user@mud> <message>'#13#10); ch.sendBuffer('Beep somebody : i3 beep <user@mud>'#13#10); ch.sendBuffer('List channels available : i3 chanlist [all] [filter]'#13#10); ch.sendBuffer('To tune into a channel : i3 listen <channel>'#13#10); ch.sendBuffer('See who is logged into a mud : i3 who <mud>'#13#10); ch.sendBuffer('Finger somebody : i3 finger <user@mud>'#13#10); ch.sendBuffer('Locate somebody on the I3 network : i3 locate <username>'#13#10); ch.sendBuffer('! To see who is listening on another mud : i3 chanwho <channel> <mud>'#13#10); ch.sendBuffer('List muds connected to I3 : i3 mudlist [filter]'#13#10); ch.sendBuffer('Information on another mud : i3 mudinfo <mud>'#13#10); ch.sendBuffer('! Ignore someone who annoys you : i3 ignore <string>'#13#10); ch.sendBuffer('! Make yourself invisible to I3 : i3 invis'#13#10); ch.sendBuffer('! Toggle I3 color : i3 color'#13#10); if (I3PERM(ch) >= I3PERM_IMM) then begin ch.sendBuffer(#13#10'Immortal functions'#13#10); ch.sendBuffer('------------------------------------------------'#13#10#13#10); ch.sendBuffer('General statistics:'#13#10); ch.sendBuffer('! i3 ucache'#13#10); ch.sendBuffer('! i3 user <person@mud>'#13#10); ch.sendBuffer('Channel control:'#13#10); ch.sendBuffer('! i3 deny <person> <channel>'#13#10); end; if (I3PERM(ch) >= I3PERM_ADMIN) then begin ch.sendBuffer(#13#10'Administrative functions'#13#10); ch.sendBuffer('------------------------------------------------'#13#10#13#10); ch.sendBuffer('New channel creation and administration:'#13#10); ch.sendBuffer('! i3 addchan <channelname> <type>'#13#10); ch.sendBuffer('! i3 removechan <channel>'#13#10); ch.sendBuffer('! i3 adminchan <channel> <add|remove> <mudname>'#13#10#13#10); ch.sendBuffer('Traffic control and permissions:'#13#10); ch.sendBuffer('! i3 ban <string>'#13#10); end; ch.sendBuffer(#13#10'(! = not implemented)'#13#10); end else ch.sendBuffer('Not implemented.'#13#10); end; function returnModuleInterface() : IModuleInterface; begin Result := GInterMudModule.Create(); end; procedure GInterMudModule.registerModule(); begin i3 := GInterMud.Create(0); registerCommand('do_i3', do_i3); registerField(GPlayerFieldFlag.Create('i3flag')); registerField(GPlayerFieldString.Create('i3replyname')); end; procedure GInterMudModule.unregisterModule(); begin unregisterField('i3flag'); unregisterField('i3replyname'); unregisterCommand('do_i3'); i3.Terminate(); { Give thread a chance to terminate and free } Sleep(250); i3.Free(); end; exports returnModuleInterface; end.