You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/kvs/kvi_kvs_coresimplecommands.cpp

238 lines
7.2 KiB

//=============================================================================
//
// File : kvi_kvs_coresimplecommands.cpp
// Created on Fri 31 Oct 2003 00:04:25 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
// Copyright (C) 2003 Szymon Stefanek <pragma at kvirc dot net>
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#define __KVIRC__
#include "kvi_ircconnectionserverinfo.h"
#include "kvi_kvs_coresimplecommands.h"
#include "kvi_kvs_kernel.h"
#include "kvi_options.h"
#include "kvi_ircconnection.h"
#include "kvi_locale.h"
#include "kvi_kvs_treenode_command.h"
#include <tqregexp.h>
#include <tqstringlist.h>
namespace KviKvsCoreSimpleCommands
{
void init()
{
KviKvsKernel * pKern = KviKvsKernel::instance();
#define _REGCMD(__cmdName,__routine) \
{ \
KviKvsCoreSimpleCommandExecRoutine * r = new KviKvsCoreSimpleCommandExecRoutine; \
r->proc = KVI_PTR2MEMBER(KviKvsCoreSimpleCommands::__routine); \
pKern->registerCoreSimpleCommandExecRoutine(TQString(__cmdName),r); \
}
// a_f
_REGCMD("admin",rfc2812wrapper)
_REGCMD("away",away)
_REGCMD("back",back)
_REGCMD("ban",ban)
_REGCMD("beep",beep)
_REGCMD("buttonctl",buttonctl)
_REGCMD("codepage",rfc2812wrapper)
_REGCMD("ctcp",ctcp)
_REGCMD("debug",debug)
_REGCMD("delete",deleteCKEYWORDWORKAROUND)
_REGCMD("delpopupitem",delpopupitem)
_REGCMD("destroy",deleteCKEYWORDWORKAROUND)
_REGCMD("deop",deop)
_REGCMD("devoice",devoice)
_REGCMD("die",error)
_REGCMD("echoprivmsg",echoprivmsg)
_REGCMD("echo",echo)
_REGCMD("error",error)
_REGCMD("eval",eval)
_REGCMD("eventctl",eventctl)
_REGCMD("exit",exit)
// g_l
_REGCMD("halt",halt)
_REGCMD("help",help)
_REGCMD("host",host)
_REGCMD("include",parse)
_REGCMD("info",rfc2812wrapper)
_REGCMD("invite",rfc2812wrapper)
_REGCMD("join",join)
_REGCMD("kick",kick)
_REGCMD("killtimer",killtimer)
_REGCMD("leave",part)
_REGCMD("links",rfc2812wrapper)
_REGCMD("list",rfc2812wrapper)
_REGCMD("listtimers",listtimers)
_REGCMD("lusers",rfc2812wrapper)
// m_r
_REGCMD("me",me)
_REGCMD("mode",mode)
_REGCMD("motd",rfc2812wrapper)
_REGCMD("msg",privmsg)
_REGCMD("nick",nick)
_REGCMD("notice",notice)
_REGCMD("op",op)
_REGCMD("openurl",openurl)
_REGCMD("oper",rfc2812wrapper)
_REGCMD("option",option)
_REGCMD("parse",parse)
_REGCMD("part",part)
_REGCMD("pass",rfc2812wrapper)
_REGCMD("play",play)
_REGCMD("popup",popup)
_REGCMD("privmsg",privmsg)
_REGCMD("query",query)
_REGCMD("quit",quit)
_REGCMD("quote",raw)
_REGCMD("raise",raise)
_REGCMD("raw",raw)
_REGCMD("return",returnCKEYWORDWORKAROUND)
_REGCMD("rebind",rebind)
// s_z
_REGCMD("run",run)
_REGCMD("say",say)
_REGCMD("server",server)
_REGCMD("service",rfc2812wrapper)
_REGCMD("setmenu",setmenu)
_REGCMD("setreturn",setreturn)
_REGCMD("sockets",rfc2812wrapper)
_REGCMD("squery",rfc2812wrapper)
_REGCMD("squit",rfc2812wrapper)
_REGCMD("srand",srand)
_REGCMD("stats",rfc2812wrapper)
_REGCMD("time",rfc2812wrapper)
_REGCMD("topic",topic)
_REGCMD("trace",rfc2812wrapper)
_REGCMD("trload",trload)
_REGCMD("trunload",trunload)
_REGCMD("unban",unban)
_REGCMD("version",rfc2812wrapper)
_REGCMD("voice",voice)
_REGCMD("warning",warning)
_REGCMD("who",rfc2812wrapper)
_REGCMD("whois",whois)
_REGCMD("whowas",whowas)
#undef _REGCMD
}
bool multipleModeCommand(KviKvsRunTimeContext * __pContext,KviKvsVariantList * __pParams,KviKvsSwitchList * __pSwitches,char plusminus,char flag)
{
TQString szTokens;
KVSCSC_PARAMETERS_BEGIN
KVSCSC_PARAMETER("tokens",KVS_PT_STRING,KVS_PF_APPENDREMAINING,szTokens)
KVSCSC_PARAMETERS_END
KVSCSC_REQUIRE_CONNECTION
if(KVSCSC_pWindow->type() != KVI_WINDOW_TYPE_CHANNEL)
{
KVSCSC_pContext->warning(__tr2qs("This is not a channel"));
return true;
}
TQStringList sl = TQStringList::split(TQRegExp("[, ]+"),szTokens,false);
KviTQCString szFlags;
KviTQCString szTarget = KVSCSC_pConnection->encodeText(KVSCSC_pWindow->windowName());
KviTQCString szMessage;
int i = 0;
for(TQStringList::Iterator it = sl.begin();it != sl.end();++it)
{
KviTQCString szTxt = KVSCSC_pConnection->encodeText(*it);
if(!szTxt.isEmpty())
{
szFlags += flag;
if(szMessage.length() > 0)szMessage += " ";
szMessage += szTxt;
i++;
if(i >= KVSCSC_pConnection->serverInfo()->maxModeChanges())
{
if(!KVSCSC_pConnection->sendFmtData("MODE %s %c%s %s",szTarget.data(),plusminus,szFlags.data(),szMessage.data()))
return KVSCSC_pContext->warningNoIrcConnection();
i = 0;
szFlags = "";
szMessage = "";
}
}
}
if(i > 0)
{
if(!KVSCSC_pConnection->sendFmtData("MODE %s %c%s %s",szTarget.data(),plusminus,szFlags.data(),szMessage.data()))
return KVSCSC_pContext->warningNoIrcConnection();
}
return true;
}
/*
@doc: rfc2821wrappers
@title:
RFC2821 Wrappers
@type:
generic
@short:
Wrappers for rfc2821 commands
@body:
Some less used KVIrc commands are implemented as simple wrappers
around the standard [doc]rfc2821[/doc] commands.[br]
For example, the /OPER command will be used only by server operators
and probably only once per connection.[br]
These commands should only be needed by experienced IRC users.
Due to this fact, these commands have no special kind of parsing performed by KVIrc;
the parameters are extracted, the identifiers are parsed normally
and are sent to the server without any semantic check.[br]
This means that while OPER requires two parameters, KVIrc will not
complain if you send a single parameter only or use ten parameters.[br]
The exact parameter syntax/semantic checking is left to you.[br]
This also means that if some of these commands accept parameters with spaces,
it is left to you to add the leading ':' before the last parameter.[br]
You should refer to [doc]rfc2812[/doc] if any of these commands do not work properly for you.[br]
*/
KVSCSC(rfc2812wrapper)
{
TQString szText;
KVSCSC_PARAMETERS_BEGIN
KVSCSC_PARAMETER("text",KVS_PT_STRING,KVS_PF_OPTIONAL | KVS_PF_APPENDREMAINING,szText)
KVSCSC_PARAMETERS_END
KVSCSC_REQUIRE_CONNECTION
KviTQCString txt = KVSCSC_pConnection->encodeText(szText);
KviTQCString cmd = KVSCSC_pConnection->encodeText(((KviKvsTreeNodeCommand *)(KVSCSC_pContext->defaultReportLocation()))->commandName());
if(!KVSCSC_pConnection->sendFmtData("%s %s",cmd.data(),txt.data() ? txt.data() : ""))
return KVSCSC_pContext->warningNoIrcConnection();
return true;
}
};