//============================================================================= // // File : kvi_kvs_corefunctions_mr.cpp // Created on Fri 31 Oct 2003 01:52:04 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2003 Szymon Stefanek // // 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_kvs_corefunctions.h" #include "kvi_kvs_kernel.h" #include "kvi_kvs_arraycast.h" #include "kvi_kvs_object_controller.h" #include "kvi_locale.h" #include "kvi_ircconnection.h" #include "kvi_mirccntrl.h" #include "kvi_options.h" #include "kvi_console.h" #include "kvi_ircuserdb.h" #include "kvi_ircmask.h" #include "kvi_socket.h" #include "kvi_app.h" #include "kvi_query.h" #include // rand & srand namespace KviKvsCoreFunctions { /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: tqmask @type: function @title: $tqmask @short: Retrieves the host tqmask of a user @syntax: $tqmask[([,])] @description: Returns the specified type of tqmask for the user with .[br] If the host or username are not known, the tqmask may contain less information than requested.[br] If the is not given it is assumed to be the current nickname.[br] If is not given or is invalid, it is assumed to be 0.[br] Available tqmask types:[br] 0 : nick!user@machine.host.top (nick!user@XXX.XXX.XXX.XXX) (default)[br] 1 : nick!user@*.abc.host.top (nick!user@XXX.XXX.XXX.*)[br] 2 : nick!user@*[br] 3 : nick!*@machine.host.top (nick!user@XXX.XXX.XXX.XXX)[br] 4 : nick!*@*.abc.host.top (nick!user@XXX.XXX.XXX.*)[br] 5 : nick!*@*[br] 6 : *!user@machine.host.top (*!user@XXX.XXX.XXX.XX)[br] 7 : *!user@*.abc.host.top (*!user@XXX.XXX.XXX.*)[br] 8 : *!user@*[br] 9 : *!*@machine.host.top (*!*@XXX.XXX.XXX.XXX)[br] 10: *!*@*.abc.host.top (*!*@XXX.XXX.XXX.*)[br] 11: nick!*user@machine.host.top (nick!*user@XXX.XXX.XXX.XXX)[br] 12: nick!*user@*.abc.host.top (nick!*user@XXX.XXX.XXX.*)[br] 13: nick!*user@*[br] 14: *!*user@machine.host.top (*!*user@XXX.XXX.XXX.XXX)[br] 15: *!*user@*.abc.host.top (*!*user@XXX.XXX.XXX.*)[br] 16: *!*user@*[br] 17: nick!~user@*.host.top (nick!~user@XXX.XXX.*)[br] 18: nick!*@*.host.top (nick!*@XXX.XXX.*)[br] 19: *!~user@*.host.top (*!~user@XXX.XXX.*)[br] 20: nick!*user@*.host.top (nick!*user@XXX.XXX.*)[br] 21: *!*user@*.host.top (*!user@*XXX.XXX.*)[br] 22: nick!~user@*.host.top (nick!~user@XXX.XXX.*)[br] 23: nick!*@*.host.top (nick!*@XXX.XXX.*)[br] 24: *!~user@*.host.top (*!~user@XXX.XXX.*)[br] 25: nick!*user@*.host.top (nick!*user@XXX.XXX.*)[br] 26: *!*user@*.host.top (*!user@*XXX.XXX.*)[br] If some data is missing, these types may change:[br] For example, if the hostname is missing, the tqmask type 3 or 4 may be reduced to type 5.[br] If the user with is not found in the current IRC context user database, an empty string is returned.[br] The masks 22-26 are the smart versions of the masks 17-21 that try take care of masked ip addresses in the form xxx.xxx.INVALID-TOP-MASK. If a masked ip address is found then the XXX.XXX.* or XXX.* host tqmask is returned instead of the (wrong) *.INVALID-TOP-MASK @examples: @seealso: */ KVSCF(tqmask) { TQString szNick; kvs_uint_t maskType; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("nickname",KVS_PT_STRING,KVS_PF_OPTIONAL,szNick) KVSCF_PARAMETER("maskType",KVS_PT_UINT,KVS_PF_OPTIONAL,maskType) KVSCF_PARAMETERS_END if(maskType > 26) maskType = 0; if(KVSCF_pContext->window()->console()) { if(KVSCF_pContext->window()->console()->isConnected()) { KviIrcUserEntry * e = KVSCF_pContext->window()->connection()->userDataBase()->find(szNick.isEmpty() ? KVSCF_pContext->window()->connection()->currentNickName() : szNick); if(e) { KviIrcMask u; u.setNick(szNick); u.setUsername(e->user()); u.setHost(e->host()); TQString tmp; u.tqmask(tmp,(KviIrcMask::MaskType)maskType); KVSCF_pRetBuffer->setString(tmp); return true; } } } KVSCF_pRetBuffer->setNothing(); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: me @type: function @title: $me @short: Returns the current nickname @syntax: $me[()] @description: Returns the current nickname used in the specified IRC context.[br] If no is specified, the current IRC context is used.[br] If you are not connected to a server, this function will return a null string.[br] If the current window is a DCC chat and no irc_context is specified, the local nickname is returned.[br] If the current window does not belong to any IRC context, no irc_context_id is specified, and the current window is not a DCC chat, a warning is printed.[br] */ KVSCF(me) { kvs_uint_t uCntx; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("irc_context_id",KVS_PT_UINT,KVS_PF_OPTIONAL,uCntx) KVSCF_PARAMETERS_END KviConsole * cns; if(KVSCF_pParams->count() > 0) { cns = g_pApp->findConsole(uCntx); if(cns) { if(cns->isConnected()) KVSCF_pRetBuffer->setString(cns->connection()->currentNickName()); else KVSCF_pRetBuffer->setNothing(); } else { KVSCF_pRetBuffer->setNothing(); } } else { if(KVSCF_pContext->window()->console()) { cns = KVSCF_pContext->window()->console(); if(cns->isConnected()) KVSCF_pRetBuffer->setString(cns->connection()->currentNickName()); else KVSCF_pRetBuffer->setNothing(); } else { if(KVSCF_pContext->window()->type() == KVI_WINDOW_TYPE_DCCCHAT) { KVSCF_pRetBuffer->setString(KVSCF_pContext->window()->localNick()); } else { KVSCF_pContext->warning(__tr2qs("This window has no associated IRC context and is not a DCC chat")); KVSCF_pRetBuffer->setNothing(); } } } return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: msgtype @type: function @title: $msgtype @short: Returns the id of a message type color set @syntax: $msgtype() @description: Returns the id of a message type color set used by the [cmd]echo[/cmd] command. You can take a look at the options dialog section related to the message output to see the list of available message type names. @examples: [example] [cmd]echo[/cmd] -i=$msgtype(Highlight) Highlighted text! [/example] @seealso: [cmd]echo[/cmd] */ KVSCF(msgtype) { TQString szName; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("msg_type_color_set_name",KVS_PT_NONEMPTYSTRING,0,szName) KVSCF_PARAMETERS_END KviStr tmp(szName); for(int i=0;i< KVI_NUM_MSGTYPE_OPTIONS;i++) { if(kvi_strEqualCI(tmp.ptr(),(g_msgtypeOptionsTable[i].name + 7))) { KVSCF_pRetBuffer->setInteger(i); return true; } } KVSCF_pRetBuffer->setInteger(0); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: new @type: function @title: $new @short: Creates a new object @syntax: $new(,[ [,[,[,[...]]]]) @description: Creates a new instance of the object with the tqparent object and the specified .[br] and are optional: if not specified, is assumed to be an empty string and default to 0 (parentless object).[br] Please see the [doc:objects]objects documentation[/doc] for more information.[br] @examples: [example] %myobj = $new(widget,0,pippo) [/example] @seealso: [doc:objects]Objects documentation[/doc], [cmd]delete[/cmd] */ KVSCF(newCKEYWORDWORKAROUND) { // prologue: parameter handling TQString szClassName; TQString szName; kvs_hobject_t hParent; KviKvsVariantList vList; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("className",KVS_PT_NONEMPTYSTRING,0,szClassName) KVSCF_PARAMETER("parentHandle",KVS_PT_HOBJECT,KVS_PF_OPTIONAL,hParent) KVSCF_PARAMETER("name",KVS_PT_STRING,KVS_PF_OPTIONAL,szName) KVSCF_PARAMETER("parameterList",KVS_PT_VARIANTLIST,KVS_PF_OPTIONAL,vList) KVSCF_PARAMETERS_END KviKvsObjectClass * pClass = KviKvsKernel::instance()->objectController()->lookupClass(szClassName); if(!pClass) { KVSCF_pContext->error(__tr2qs("Class \"%Q\" is not defined"),&szClassName); return false; } KviKvsObject * pParent; if(hParent != (kvs_hobject_t)0) { pParent = KviKvsKernel::instance()->objectController()->lookupObject(hParent); if(!pParent) { KVSCF_pContext->error(__tr2qs("The specified tqparent object does not exist")); return false; } } else { pParent = 0; } KviKvsObject * pObject = pClass->allocateInstance(pParent,szName,KVSCF_pContext,&vList); // epilogue: set the return value KVSCF_pRetBuffer->setHObject(pObject ? pObject->handle() : (kvs_hobject_t)0); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: nothing @type: function @title: $nothing @short: Evaluates to an empty variable @syntax: $nothing @description: Evaluates to an empty variable. This is a special value somewhat similar to the [fnc]$null[/fnc] object: it is used to denote absence of information. For example, a function might decide to return a meaningful value when the input parameters are correct and $nothing when the input parameters are wrong. @seealso: [fnc]$null[/fnc] */ KVSCF(nothing) { KVSCF_pRetBuffer->setNothing(); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: null @type: function @title: $null @short: Evaluates to the null object handle. @syntax: $null @description: Evaluates to the null object handle. This is a special object handle that is returned by some functions. Please note that writing $null is semantically equivalent to writing 0 or even [fnc]$nothing[/fnc] in place of the handle, but $null increases code readability. @seealso: [fnc]$new[/fnc], [fnc]$nothing[/fnc] */ KVSCF(nullCKEYWORDWORKAROUND) { KVSCF_pRetBuffer->setHObject(0); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: o @type: function @title: $o @short: Returns the RESET mIRC control character @syntax: $o @description: Returns the RESET mIRC control character (CTRL+O).[br] @seealso: [fnc]$k[/fnc], [fnc]$b[/fnc], [fnc]$u[/fnc], [fnc]$r[/fnc] */ KVSCF(o) { KVSCF_pRetBuffer->setString(TQString(TQChar(KVI_TEXT_RESET))); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: option @type: function @title: $option @short: Returns the value of an option @syntax: $option() @description: Returns the current value of the internal option named . See the [cmd]option[/cmd] command documentation for more info about options. @examples: [example] [cmd]echo[/cmd] $option(fontIrcView) [/example] @seealso: [cmd]option[/cmd], */ KVSCF(option) { TQString szOpt; // FIXME: This should return a variant in general KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("optionName",KVS_PT_NONEMPTYSTRING,0,szOpt) KVSCF_PARAMETERS_END TQString tmp; if(g_pApp->getOptionString(szOpt,tmp))KVSCF_pRetBuffer->setString(tmp); else { KVSCF_pContext->warning(__tr2qs("There is no option named '%Q'"),&szOpt); KVSCF_pRetBuffer->setNothing(); } return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: query @type: function @title: $query @short: Retrieves the window ID of a specified query @syntax: $query[([,])] @description: Returns the [b]window ID[/b] of the query that has in the list of targets and is bound to the connection specified by [br] If no window matches the specified target or context, and invalid window ID is returned (0).[br] If no is specified, this function looks for the query in the current connection context (if any).[br] If no is specified, this function returns the current query window ID, if executed in a query, else 0.[br] @examples: [example] [/example] @seealso: [fnc]$window[/fnc], [fnc]$channel[/fnc], [fnc]$console[/fnc] [doc:window_naming_conventions]Window naming conventions[/doc] */ KVSCF(query) { TQString szName; kvs_uint_t uContextId; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("query_name",KVS_PT_NONEMPTYSTRING,KVS_PF_OPTIONAL,szName) KVSCF_PARAMETER("context_id",KVS_PT_UINT,KVS_PF_OPTIONAL,uContextId) KVSCF_PARAMETERS_END KviWindow * wnd; if(KVSCF_pParams->count() > 0) { if(KVSCF_pParams->count() > 1) { KviConsole * cons = g_pApp->findConsole(uContextId); if(!cons)KVSCF_pContext->warning(__tr2qs("No such IRC context (%u)"),uContextId); else { if(cons->connection()) wnd = cons->connection()->findQuery(szName); else wnd = 0; } } else { if(KVSCF_pContext->window()->connection())wnd = KVSCF_pContext->window()->connection()->findQuery(szName); else { if(!KVSCF_pContext->window()->console()) KVSCF_pContext->warning(__tr2qs("This window is not associated to an IRC context")); wnd = 0; } } } else { if(KVSCF_pContext->window()->type() == KVI_WINDOW_TYPE_TQUERY)wnd = KVSCF_pContext->window(); } KVSCF_pRetBuffer->setInteger((kvs_int_t)(wnd ? wnd->numericId() : 0)); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: r @type: function @title: $r @short: Returns the REVERSE mIRC control character @syntax: $r @description: Returns the REVERSE mIRC control character (CTRL+R).[br] @seealso: [fnc]$k[/fnc], [fnc]$b[/fnc], [fnc]$u[/fnc], [fnc]$o[/fnc] */ KVSCF(r) { KVSCF_pRetBuffer->setString(TQString(TQChar(KVI_TEXT_REVERSE))); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: rand @type: function @title: $rand @short: Generates a random number @syntax: $rand() @description: Returns a random integer number from 0 to max inclusive. You can repeat sequences of random numbers by calling [cmd]srand[/cmd] with the same seed value. If [cmd]srand[/cmd] has not been called $rand is automatically seeded with value of 1. If no is specified, this function returns an integer between 0 and RAND_MAX that is system dependant. @examples: [example] [/example] @seealso: [cmd]srand[/cmd] */ KVSCF(rand) { // prologue: parameter handling kvs_uint_t uMax; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("max",KVS_PT_UINT,KVS_PF_OPTIONAL,uMax) KVSCF_PARAMETERS_END if(KVSCF_pParams->count() > 0) { KVSCF_pRetBuffer->setInteger(::rand() % (uMax+1)); } else { KVSCF_pRetBuffer->setInteger(::rand()); } return true; } /////////////////////////////////////////////////////////////////////////////////////////////// /* @doc: real @type: function @title: $real @short: Casts a variable to a real @syntax: $real() @description: Forces to be a "real" data type with the following semantics:[br] [ul] [li]If is a real, itself is returned.[/li] [li]If is an integer, itself is returned, in its real form.[/li] [li]If is a boolean, its numeric value is returned (either 1.0 or 0.0).[/li] [li]If is an array, the count of its items is returned.[/li] [li]If is a hash, the count of its items is returned.[/li] [li]If is a string, its length is returned.[/li] [li]If is an object, 0.0 is returned if the reference is null (invalid) and 1.0 otherwise[/li] [/ul] This function is similar to the C (double) cast.[br] Note that since KVIrc does most of the casting work automatically you shouldn't need to use this function. @seealso: [fnc]$int[/fnc] */ KVSCF(real) { KviKvsVariant * v; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("data",KVS_PT_VARIANT,0,v) KVSCF_PARAMETERS_END kvs_real_t dVal; if(v->asReal(dVal)) KVSCF_pRetBuffer->setReal(dVal); else { kvs_int_t iVal; v->castToInteger(iVal); KVSCF_pRetBuffer->setReal((double)iVal); } return true; } /* @doc: receivedBytes @type: function @title: $receivedBytes @short: Returns total received bytes @syntax: $receivedBytes() @description: Returns total received bytes @seealso: [fnc]$sentBytes[/fnc] */ KVSCF(receivedBytes) { KVSCF_pRetBuffer->setInteger(g_uIncomingTraffic); return true; } /* @doc: rsort @type: function @title: $rsort @short: Sorts an array in reverse order @syntax: $rsort() @description: Sorts an array in descending order. @seealso: [fnc]$sort[/fnc] */ KVSCF(rsort) { KviKvsArrayCast a; KVSCF_PARAMETERS_BEGIN KVSCF_PARAMETER("data",KVS_PT_ARRAYCAST,0,a) KVSCF_PARAMETERS_END if(a.array()) { KviKvsArray * arry = new KviKvsArray(*(a.array())); arry->rsort(); KVSCF_pRetBuffer->setArray(arry); } else { KVSCF_pRetBuffer->setArray(new KviKvsArray()); } return true; } };