mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 00:37:15 +01:00
Implemented formatted messaging on IRC session type.
Duplicate SetDccVersion as property and not just method.
This commit is contained in:
parent
31c151ac63
commit
48406020f8
@ -1,6 +1,9 @@
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
#include "Library/IRC.hpp"
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
#include <sqstdstring.h>
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
#include <algorithm>
|
||||
|
||||
@ -708,6 +711,207 @@ void Session::OnDccSendReq(irc_session_t * session, CCStr nick, CCStr addr, CCSt
|
||||
ForwardEvent(inst, inst->m_OnDccSendReq, nick, addr, filename, size, dccid);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
SQInteger Session::CmdMsgF(HSQUIRRELVM vm)
|
||||
{
|
||||
// Save the stack top
|
||||
const Int32 top = sq_gettop(vm);
|
||||
// Do we have a target?
|
||||
if (top <= 1)
|
||||
return sq_throwerror(vm, "Missing the message target");
|
||||
// Do we have a valid target?
|
||||
else if (sq_gettype(vm, 2) != OT_STRING)
|
||||
return sq_throwerror(vm, "Invalid target specified");
|
||||
// Do we have a message value?
|
||||
else if (top <= 2)
|
||||
return sq_throwerror(vm, "Missing the message value");
|
||||
// Obtain the instance and target
|
||||
Var< Session * > inst(vm, 1);
|
||||
Var< String > target(vm, 2);
|
||||
// The value returned by the command
|
||||
Int32 code = -1;
|
||||
// Do we have a valid session instance?
|
||||
if (!inst.value)
|
||||
return sq_throwerror(vm, "Invalid session instance");
|
||||
// Is the specified message value a string or something convertible to string?
|
||||
else if (top == 3 && ((sq_gettype(vm, -1) == OT_STRING) || !SQ_FAILED(sq_tostring(vm, -1))))
|
||||
{
|
||||
CSStr msg = NULL;
|
||||
// Attempt to retrieve the string from the stack
|
||||
if (SQ_FAILED(sq_getstring(vm, -1, &msg)))
|
||||
{
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
// Now we can throw the error message
|
||||
return sq_throwerror(vm, "Unable to retrieve the message");
|
||||
}
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdMsg(target.value.c_str(), msg);
|
||||
}
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
}
|
||||
// Do we have enough values to call the format function?
|
||||
else if (top > 3)
|
||||
{
|
||||
SStr msg = NULL;
|
||||
SQInteger len = 0;
|
||||
// Attempt to generate the specified string format
|
||||
SQRESULT ret = sqstd_format(vm, 3, &len, &msg);
|
||||
// Did the format failed?
|
||||
if (SQ_FAILED(ret))
|
||||
return ret;
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdMsg(target.value.c_str(), msg);
|
||||
}
|
||||
}
|
||||
// All methods of retrieving the message value failed
|
||||
else
|
||||
return sq_throwerror(vm, "Unable to extract the player message");
|
||||
// Push the obtained code onto the stack
|
||||
sq_pushinteger(vm, code);
|
||||
// We have a value on the stack
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
SQInteger Session::CmdMeF(HSQUIRRELVM vm)
|
||||
{
|
||||
// Save the stack top
|
||||
const Int32 top = sq_gettop(vm);
|
||||
// Do we have a target?
|
||||
if (top <= 1)
|
||||
return sq_throwerror(vm, "Missing the message target");
|
||||
// Do we have a valid target?
|
||||
else if (sq_gettype(vm, 2) != OT_STRING)
|
||||
return sq_throwerror(vm, "Invalid target specified");
|
||||
// Do we have a message value?
|
||||
else if (top <= 2)
|
||||
return sq_throwerror(vm, "Missing the message value");
|
||||
// Obtain the instance and target
|
||||
Var< Session * > inst(vm, 1);
|
||||
Var< String > target(vm, 2);
|
||||
// The value returned by the command
|
||||
Int32 code = -1;
|
||||
// Do we have a valid session instance?
|
||||
if (!inst.value)
|
||||
return sq_throwerror(vm, "Invalid session instance");
|
||||
// Is the specified message value a string or something convertible to string?
|
||||
else if (top == 3 && ((sq_gettype(vm, -1) == OT_STRING) || !SQ_FAILED(sq_tostring(vm, -1))))
|
||||
{
|
||||
CSStr msg = NULL;
|
||||
// Attempt to retrieve the string from the stack
|
||||
if (SQ_FAILED(sq_getstring(vm, -1, &msg)))
|
||||
{
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
// Now we can throw the error message
|
||||
return sq_throwerror(vm, "Unable to retrieve the message");
|
||||
}
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdMe(target.value.c_str(), msg);
|
||||
}
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
}
|
||||
// Do we have enough values to call the format function?
|
||||
else if (top > 3)
|
||||
{
|
||||
SStr msg = NULL;
|
||||
SQInteger len = 0;
|
||||
// Attempt to generate the specified string format
|
||||
SQRESULT ret = sqstd_format(vm, 3, &len, &msg);
|
||||
// Did the format failed?
|
||||
if (SQ_FAILED(ret))
|
||||
return ret;
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdMe(target.value.c_str(), msg);
|
||||
}
|
||||
}
|
||||
// All methods of retrieving the message value failed
|
||||
else
|
||||
return sq_throwerror(vm, "Unable to extract the player message");
|
||||
// Push the obtained code onto the stack
|
||||
sq_pushinteger(vm, code);
|
||||
// We have a value on the stack
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
SQInteger Session::CmdNoticeF(HSQUIRRELVM vm)
|
||||
{
|
||||
// Save the stack top
|
||||
const Int32 top = sq_gettop(vm);
|
||||
// Do we have a target?
|
||||
if (top <= 1)
|
||||
return sq_throwerror(vm, "Missing the message target");
|
||||
// Do we have a valid target?
|
||||
else if (sq_gettype(vm, 2) != OT_STRING)
|
||||
return sq_throwerror(vm, "Invalid target specified");
|
||||
// Do we have a message value?
|
||||
else if (top <= 2)
|
||||
return sq_throwerror(vm, "Missing the message value");
|
||||
// Obtain the instance and target
|
||||
Var< Session * > inst(vm, 1);
|
||||
Var< String > target(vm, 2);
|
||||
// The value returned by the command
|
||||
Int32 code = -1;
|
||||
// Do we have a valid session instance?
|
||||
if (!inst.value)
|
||||
return sq_throwerror(vm, "Invalid session instance");
|
||||
// Is the specified message value a string or something convertible to string?
|
||||
else if (top == 3 && ((sq_gettype(vm, -1) == OT_STRING) || !SQ_FAILED(sq_tostring(vm, -1))))
|
||||
{
|
||||
CSStr msg = NULL;
|
||||
// Attempt to retrieve the string from the stack
|
||||
if (SQ_FAILED(sq_getstring(vm, -1, &msg)))
|
||||
{
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
// Now we can throw the error message
|
||||
return sq_throwerror(vm, "Unable to retrieve the message");
|
||||
}
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdNotice(target.value.c_str(), msg);
|
||||
}
|
||||
// If the value was converted to a string then pop the string
|
||||
sq_settop(vm, top);
|
||||
}
|
||||
// Do we have enough values to call the format function?
|
||||
else if (top > 3)
|
||||
{
|
||||
SStr msg = NULL;
|
||||
SQInteger len = 0;
|
||||
// Attempt to generate the specified string format
|
||||
SQRESULT ret = sqstd_format(vm, 3, &len, &msg);
|
||||
// Did the format failed?
|
||||
if (SQ_FAILED(ret))
|
||||
return ret;
|
||||
// Forward the resulted string value
|
||||
else if (msg)
|
||||
{
|
||||
code = inst.value->CmdNotice(target.value.c_str(), msg);
|
||||
}
|
||||
}
|
||||
// All methods of retrieving the message value failed
|
||||
else
|
||||
return sq_throwerror(vm, "Unable to extract the player message");
|
||||
// Push the obtained code onto the stack
|
||||
sq_pushinteger(vm, code);
|
||||
// We have a value on the stack
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
CSStr GetNick(CSStr origin)
|
||||
{
|
||||
@ -778,6 +982,7 @@ void Register_IRC(HSQUIRRELVM vm)
|
||||
.Prop(_SC("Reconnecting"), &Session::GetReconnect)
|
||||
.Prop(_SC("IPv6"), &Session::GetIPv6)
|
||||
.Prop(_SC("Server"), &Session::GetServer, &Session::SetServer)
|
||||
.Prop(_SC("CtcpVersion"), (void (Session::*)(void))(NULL), &Session::SetCtcpVersion)
|
||||
.Prop(_SC("ErrNo"), &Session::GetErrNo)
|
||||
.Prop(_SC("ErrStr"), &Session::GetErrStr)
|
||||
.Prop(_SC("OnConnect"), &Session::GetOnConnect)
|
||||
@ -863,6 +1068,9 @@ void Register_IRC(HSQUIRRELVM vm)
|
||||
.Func(_SC("BindNumeric"), &Session::BindOnNumeric)
|
||||
.Func(_SC("BindDccChatReq"), &Session::BindOnDccChatReq)
|
||||
.Func(_SC("BindDccSendReq"), &Session::BindOnDccSendReq)
|
||||
.SquirrelFunc(_SC("CmdMsgF"), &Session::CmdMsgF)
|
||||
.SquirrelFunc(_SC("CmdMeF"), &Session::CmdMeF)
|
||||
.SquirrelFunc(_SC("CmdNoticeF"), &Session::CmdNoticeF)
|
||||
);
|
||||
|
||||
ircns.Func(_SC("GetNick"), &GetNick);
|
||||
|
@ -896,6 +896,21 @@ public:
|
||||
return irc_option_set(m_Session, option);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Send a message to a specific channel or privately to another nick.
|
||||
*/
|
||||
static SQInteger CmdMsgF(HSQUIRRELVM vm);
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Send a /me message (CTCP ACTION) to a specific channel or privately to another nick.
|
||||
*/
|
||||
static SQInteger CmdMeF(HSQUIRRELVM vm);
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Send a notice to a specific channel or privately to another nick.
|
||||
*/
|
||||
static SQInteger CmdNoticeF(HSQUIRRELVM vm);
|
||||
|
||||
protected:
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user