From b0d2cc96cabd1db9f24e5f5873992420b5eebb78 Mon Sep 17 00:00:00 2001 From: hx-w Date: Wed, 3 Nov 2021 12:27:34 +0800 Subject: [PATCH] remove socket dependency --- plugins/csgowiki-pack.smx | Bin 37924 -> 37870 bytes scripting/csgowiki-pack.sp | 2 - scripting/csgowiki/qqchat.sp | 241 ---------------- scripting/include/csgowiki.inc | 2 - scripting/include/socket.inc | 505 --------------------------------- 5 files changed, 750 deletions(-) delete mode 100644 scripting/csgowiki/qqchat.sp delete mode 100644 scripting/include/socket.inc diff --git a/plugins/csgowiki-pack.smx b/plugins/csgowiki-pack.smx index 698e80819522040eb3b5fee8660d76f74971a348..c94d3656fb779579f4416b429b275e34d8f01041 100644 GIT binary patch literal 37870 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 a=4#No`cY%AFDv82Y<~-stN%Z_bcqoV9du3r literal 37924 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.Data); - json_obj.GetString("status", status, LENGTH_STATUS); - if (!StrEqual(status, "ok")) { - if (IsPlayer(client)) { - PrintToChat(client, "%s \x02未能成功发送消息", PREFIX); - } - } - else { - if (IsPlayer(client)) { - PrintToChat(client, "%s \x06消息发送成功", PREFIX); - } - } - delete json_obj; - } - else { - PrintToChat(client, "%s \x02服务器状态异常:%d", PREFIX, response.Status); - } -} - -void TcpCreate() { - g_hChannelEnable = FindConVar("sm_qqchat_enable"); - if (!GetConVarBool(g_hChannelEnable)) { - return; - } - g_hCSGOWikiToken = FindConVar("sm_csgowiki_token"); - g_hChannelQQgroup = FindConVar("sm_qqchat_qqgroup"); - g_hChannelServerRemark = FindConVar("sm_qqchat_remark"); - g_hChannelSvPort = FindConVar("sm_qqchat_sv_port"); - g_hChannelSvHost = FindConVar("sm_qqchat_sv_host"); - char remark[LENGTH_NAME]; - char qqgroup[LENGTH_NAME]; - char svHost[LENGTH_IP]; - char token[LENGTH_TOKEN]; - int svPort = GetConVarInt(g_hChannelSvPort); - GetConVarString(g_hChannelSvHost, svHost, sizeof(svHost)); - if (strlen(svHost) == 0) { - GetServerHost(svHost, LENGTH_IP); - } - GetConVarString(g_hChannelServerRemark, remark, sizeof(remark)); - GetConVarString(g_hChannelQQgroup, qqgroup, sizeof(qqgroup)); - GetConVarString(g_hCSGOWikiToken, token, sizeof(token)); - - if (strlen(qqgroup) == 0 || strlen(svHost) == 0 || strlen(remark) == 0) { - PrintToServer("群号或主机信息获取失败"); - PrintToChatAll("%s \x02QQ或主机获取失败", PREFIX); - return; - } - - HTTPRequest httpRequest = new HTTPRequest("https://service-mxw8pitd-1256946954.cd.apigw.tencentcs.com/release/api/tcp_create"); - - JSONObject postData = new JSONObject(); - postData.SetString("sv_remark", remark); - postData.SetString("qq_group", qqgroup); - postData.SetString("sv_host", svHost); - postData.SetString("token", token); - postData.SetInt("sv_port", svPort); - - httpRequest.Post(postData, TcpCreateCallback); - delete postData; -} - -void TcpCreateCallback(HTTPResponse response, any data) { - if (response.Status == HTTPStatus_OK) { - char status[LENGTH_STATUS]; - JSONObject json_obj = view_as(response.Data); - json_obj.GetString("status", status, LENGTH_STATUS); - if (StrEqual(status, "error")) { - PrintToChatAll("%s \x02消息通道建立失败", PREFIX); - PrintToServer("%s \x02消息通道建立失败", PREFIX); - } - else if (StrEqual(status, "ok")){ - PrintToServer("%s \x06消息通道建立成功", PREFIX); - } - delete json_obj; - } - else { - PrintToServer("%s 消息通道服务器连接失败:%d", PREFIX, response.Status); - } -} - -void TcpClose() { - char remark[LENGTH_NAME]; - char qqgroup[LENGTH_NAME]; - char svHost[LENGTH_IP]; - char token[LENGTH_TOKEN] - GetServerHost(svHost, LENGTH_IP); - GetConVarString(g_hChannelServerRemark, remark, sizeof(remark)); - GetConVarString(g_hChannelQQgroup, qqgroup, sizeof(qqgroup)); - GetConVarString(g_hCSGOWikiToken, token, sizeof(token)) - - HTTPRequest httpRequest = new HTTPRequest("https://service-mxw8pitd-1256946954.cd.apigw.tencentcs.com/release/api/tcp_close"); - - JSONObject postData = new JSONObject(); - postData.SetString("sv_remark", remark); - postData.SetString("qq_group", qqgroup); - postData.SetString("sv_host", svHost); - postData.SetString("token", token); - - httpRequest.Post(postData, TcpCloseCallback); - delete postData; -} - -void TcpCloseCallback(HTTPResponse response, any data) { - if (response.Status == HTTPStatus_OK) { - char status[LENGTH_STATUS]; - JSONObject json_obj = view_as(response.Data); - json_obj.GetString("status", status, LENGTH_STATUS); - if (StrEqual(status, "error")) { - PrintToChatAll("%s \x02消息通道关闭失败", PREFIX); - } - else if (StrEqual(status, "ok")){ - PrintToServer("%s \x06消息通道关闭成功", PREFIX); - } - delete json_obj; - } -} - -public Action:TcpHeartBeat(Handle timer) { - TcpCreate(); -} - -public Action OnSocketIncoming(Handle socket, Handle newSocket, char[] remoteIP, int remotePort, any arg) { - // setup callbacks required to 'enable' newSocket - // newSocket won't process data until these callbacks are set - SocketSetReceiveCallback(newSocket, OnChildSocketReceive); - SocketSetDisconnectCallback(newSocket, OnChildSocketDisconnected); - SocketSetErrorCallback(newSocket, OnChildSocketError); - // SocketSend(newSocket, "send quit to quit\n"); -} - -public Action OnSocketError(Handle socket, const int errorType, const int errorNum, args) { - // a socket error occured - - LogError("socket error %d (errno %d)", errorType, errorNum); - CloseHandle(socket); -} - -public Action OnChildSocketReceive(Handle socket, char[] receiveData, const int dataSize, any hFile) { - // send (echo) the received data back - if (dataSize <= 1 || receiveData[0] != '{') { - PrintToServer("[Socket] receive error: %s", receiveData); - return; - } - JSONObject json_obj = JSONObject.FromString(receiveData); - char sender[LENGTH_NAME]; - char message[LENGTH_MESSAGE]; - int msg_type = json_obj.GetInt("msg_type"); - json_obj.GetString("sender", sender, sizeof(sender)); - json_obj.GetString("message", message, sizeof(message)); - - if (msg_type == 0) { - PrintToChatAll("[\x09QQ\x01] \x04%s\x01:%s", sender, message); - PrintToServer("[QQ] \x04%s\x01:%s", sender, message); - } - else if (msg_type == 1) { - char monitor_str[LENGTH_SERVER_MONITOR]; - JSONArray monitor_json = encode_json_server_monitor(-2, false, false, true); - monitor_json.ToString(monitor_str, LENGTH_SERVER_MONITOR); - MessageToQQ(-1, "Bot", monitor_str, 1); - } - else if (msg_type == 2) { - char monitor_str[LENGTH_SERVER_MONITOR]; - JSONArray monitor_json = encode_json_server_monitor(-2, false, false, true, true); - monitor_json.ToString(monitor_str, LENGTH_SERVER_MONITOR); - SocketSend(socket, monitor_str); - } - delete json_obj; - // SocketSend(socket, receiveData); - // close the connection/socket/handle if it matches quit - // if (strncmp(receiveData, "quit", 4) == 0) CloseHandle(socket); -} - -public Action OnChildSocketDisconnected(Handle socket, args) { - // remote side disconnected - CloseHandle(socket); -} - -public Action OnChildSocketError(Handle socket, const int errorType, const int errorNum, any ary) { - // a socket error occured - LogError("child socket error %d (errno %d)", errorType, errorNum); - CloseHandle(socket); -} \ No newline at end of file diff --git a/scripting/include/csgowiki.inc b/scripting/include/csgowiki.inc index 3c16303..8011100 100644 --- a/scripting/include/csgowiki.inc +++ b/scripting/include/csgowiki.inc @@ -3,7 +3,6 @@ #include #include #include -#include #include #define PREFIX "\x01[\x05CSGOWiki\x01]" @@ -29,7 +28,6 @@ #define CSGO_ACTION_NUM 9 #define CSGOWIKI_ACTION_NUM 7 -Handle g_hSocket = INVALID_HANDLE; // 功能开关 steambind 不能关闭 Handle g_hCSGOWikiEnable = INVALID_HANDLE; Handle g_hOnUtilitySubmit = INVALID_HANDLE; diff --git a/scripting/include/socket.inc b/scripting/include/socket.inc deleted file mode 100644 index e101924..0000000 --- a/scripting/include/socket.inc +++ /dev/null @@ -1,505 +0,0 @@ -// socket extension include file - -#if defined _socket_included - #endinput -#endif -#define _socket_included -#include - -enum SocketType { - SOCKET_TCP = 1, - SOCKET_UDP, - SOCKET_RAW -} - -#define EMPTY_HOST 1 -#define NO_HOST 2 -#define CONNECT_ERROR 3 -#define SEND_ERROR 4 -#define BIND_ERROR 5 -#define RECV_ERROR 6 -#define LISTEN_ERROR 7 - - -/*************************************************************************************************/ -/******************************************** options ********************************************/ -/*************************************************************************************************/ - - -/** - * Options available for SocketSetOption() - * - * @note modifying these options is not required for normal operation, you can skip the whole - * section in most cases. - */ -enum SocketOption { -/** - * If this option is set the socket extension will try to concatenate SocketReceive callbacks. - * - * This will possibly lower the amount of callbacks passed to SourceMod plugins and improve the - * performance. The socket extension will preserve the packet order. - * - * @note this doesn't prevent multiple callbacks, it only reduces them for high load. - * @note this will not truncate packets below 4096 bytes, setting it lower will be ignored - * @note set this option if you expect lots of data in a short timeframe - * @note don't forget to set your buffer sizes at least to the value passed to this function, but - * always at least to 4096 - * - * @param cell_t 0(=default) to disable or max. chunk size including \0 terminator in bytes - * @return bool true on success - */ - ConcatenateCallbacks = 1, -/** - * If this option is set the socket extension will enforce a mutex lock in the GameFrame() hook. - * - * This will ensure that callbacks will be processed every gameframe as fast as possible with the - * drawback of potentially creating lag. It's not recommended to set this option for most cases. - * If this option is not se/ the gameframe will be skipped if quietly obtaining a lock fails. - * - * @note combine this with CallbacksPerFrame for best performance - * @note this option will affect all sockets from all plugins, use it with caution! - * - * @param bool whether to force locking or not - * @return bool true on success - */ - ForceFrameLock, -/** - * This will specify the maximum amount of callbacks processed in every gameframe. - * - * The default value for this option is 1, setting it higher will possibly increase networking - * performance but may cause lag if it's set too high. - * The amount of callbacks actually being processed is limited by not being able to quietly obtain - * a lock (see ForceFrameLock) and the amount of callbacks in the queue. - * - * @note this option will affect all sockets from all plugins, use it with caution! - * - * @param cell_t maximum amount of callbacks per gameframe - * @return bool true on success - */ - CallbacksPerFrame, -/** - * If this option is set the socket will be allowed to send broadcast messages in case the protocol - * supports it. This is a wrapper for setting SO_BROADCAST. - * - * @param bool whether to allow broadcasting or not - * @return bool true on success - */ - SocketBroadcast, -/** - * If this option is set SocketBind() will allow reusing local adresses in case the protocol - * supports it. This is a wrapper for setting SO_REUSEADDR. - * - * @param bool whether to allow broadcasting or not - * @return bool true on success - */ - SocketReuseAddr, -/** - * If this option is set the socket will try to keep the connection alive by periodically sending - * messages if the protocol supports it. This is a wrapper for setting SO_KEEPALIVE. - * - * @param bool whether to allow broadcasting or not - * @return bool true on success - */ - SocketKeepAlive, -/** - * This option specifies how long a socket will wait if it's being closed and its send buffer is - * still filled. This is a wrapper for setting SO_LINGER. - * - * @param cell_t 0 (=default) to disable or time in s - * @return bool true on success - */ - SocketLinger, -/** - * If this option is set out-of-band data will be inlined into the normal receive stream. This is a - * wrapper for setting SO_OOBINLINE. - * - * @param bool whether to inline out-of-band data or not - * @return bool true on success - */ - SocketOOBInline, -/** - * This option specifies how large the send buffer will be. This is a wrapper for setting - * SO_SNDBUF. - * - * @param cell_t size in bytes - * @return bool true on success - */ - SocketSendBuffer, -/** - * This option specifies how large the receive buffer will be. This is a wrapper for setting - * SO_RCVBUF. - * - * @param cell_t size in bytes - * @return bool true on success - */ - SocketReceiveBuffer, -/** - * If this option is set outgoing messages will ignore the default routing facilities if the - * protocol implementation supports it. The remote site should be directly connected to the sender. - * This is a wrapper for setting SO_DONTROUTE. - * - * @param bool whether to skip default routing or not - * @return bool true on success - */ - SocketDontRoute, -/** - * This option specifies the minimum amount of data to receive before processing it. This is a - * wrapper for setting SO_RCVLOWAT. - * - * @note this can probably block the extension, use it with caution! - * - * @param cell_t size in bytes - * @return bool true on success - */ - SocketReceiveLowWatermark, -/** - * This option specifies how long a socket will try to receive data before it times out and - * processes the data. This is a wrapper for setting SO_RCVTIMEO. - * - * @param cell_t 0 (=default) to disable or time in ms - * @return bool true on success - */ - SocketReceiveTimeout, -/** - * This option specifies the minimum amount of data required in the send buffer before starting to - * send it. This is a wrapper for setting SO_SNDLOWAT. - * - * @note this can probably block the extension, use it with caution! - * - * @param cell_t size in bytes - * @return bool true on success - */ - SocketSendLowWatermark, -/** - * This option specifies how long a socket will try to send data before it times out and - * retries it later. This is a wrapper for setting SO_SNDTIMEO. - * - * @param cell_t 0 (=default) to disable or time in ms - * @return bool true on success - */ - SocketSendTimeout, -/** - * If this option is set the socket extension will display debugging messages in the server console/logs. - * - * @param bool whether to enable debugging or not - * @return bool true on success - */ - DebugMode -} - - -/*************************************************************************************************/ -/******************************************* callbacks *******************************************/ -/*************************************************************************************************/ - - -/** - * triggered if a normal sockets finished connecting and is ready to be used - * - * @param socket The socket handle pointing to the calling socket - * @param arg The argument set by SocketSetArg() - * @noreturn - */ -// funcenum SocketConnectCB -// { -// public(Handle:socket, any:arg) -// }; -typeset SocketConnectCB { - function Action(Handle socket, any arg) -}; - -/** - * triggered if a listening socket received an incoming connection and is ready to be used - * - * @note The child-socket won't work until receive-, disconnect-, and errorcallback for it are set. - * - * @param Handle socket The socket handle pointing to the calling listen-socket - * @param Handle newSocket The socket handle to the newly spawned child socket - * @param String remoteIP The remote IP - * @param any arg The argument set by SocketSetArg() for the listen-socket - * @noreturn - */ -// funcenum SocketIncomingCB -// { -// public(Handle:socket, Handle:newSocket, const String:remoteIP[], remotePort, any:arg) -// }; -typeset SocketIncomingCB { - function Action (Handle socket, Handle newSocket, const char remoteIP[], int remotePort, any arg) -}; - -/** - * triggered if a socket receives data - * - * @note This is binary safe if you always use dataSize for operations on receiveData[] - * @note packets may be split up into multiple chunks -> multiple calls to the receive callback - * @note if not set otherwise by SocketSetOption(..., ConcatenateCallbacks, ...) receiveData will - * never be longer than 4096 characters including \0 terminator - * - * @param Handle socket The socket handle pointing to the calling socket - * @param String receiveData The data which arrived, 0-terminated at receiveData[dataSize] - * @param cell_t dataSize The length of the arrived data excluding the 0-termination - * @param any arg The argument set by SocketSetArg() for the socket - * @noreturn - */ -// funcenum SocketReceiveCB -// { -// public(Handle:socket, const String:receiveData[], const dataSize, any:arg) -// }; -typeset SocketReceiveCB { - function Action (Handle socket, const char receiveData[], const int dataSize, any arg) -}; - -/** - * called after a socket sent all items in its send queue successfully - * - * @param Handle socket The socket handle pointing to the calling socket - * @param any arg The argument set by SocketSetArg() for the socket - * @noreturn - */ -// funcenum SocketSendqueueEmptyCB -// { -// public(Handle:socket, any:arg) -// }; -typeset SocketSendqueueEmptyCB { - function Action(Handle socket, any arg) -}; - -/** - * called if a socket has been properly disconnected by the remote side - * - * @note You should call CloseHandle(socket) or reuse the socket before this function ends - * - * @param Handle socket The socket handle pointing to the calling socket - * @param any arg The argument set by SocketSetArg() for the socket - * @noreturn - */ -// funcenum SocketDisconnectCB -// { -// public(Handle:socket, any:arg) -// }; -typeset SocketDisconnectCB { - function Action(Handle socket, any arg) -}; - -/** - * called if an unrecoverable error occured, close the socket without an additional call to a disconnect callback - * - * @note You should call CloseHandle(socket) or reuse the socket before this function ends - * - * @param Handle socket The socket handle pointing to the calling socket - * @param cell_t errorType The error type, see defines above - * @param cell_t errorNum The errno, see errno.h for details - * @param any arg The argument set by SocketSetArg() for the socket - * @noreturn - */ -// funcenum SocketErrorCB -// { -// public(Handle:socket, const errorType, const errorNum, any:arg) -// }; -typeset SocketErrorCB { - function Action(Handle socket, const int errorType, const int errorNum, any arg) -}; - -/*************************************************************************************************/ -/******************************************** natives ********************************************/ -/*************************************************************************************************/ - - -/** - * Returns whether a socket is connected or not. - * - * @param socket Socket handle to check - * @return bool The connection status - */ -native bool:SocketIsConnected(Handle:socket); - - -/** - * Creates a new socket. - * - * @note this function may be relatively expensive, reuse sockets if possible - * - * @param SocketType protocol The protocol to use, SOCKET_TCP is default - * @param SocketErrorCB efunc The error callback - * @return Handle The socket handle. Returns INVALID_HANDLE on failure - */ -native Handle:SocketCreate(SocketType protocol=SOCKET_TCP, SocketErrorCB efunc); - -/** - * Binds the socket to a local address - * - * @param Handle socket The handle of the socket to be used. - * @param String hostname The hostname (or IP) to bind the socket to. - * @param cell_t port The port to bind the socket to. - * @return bool true on success - */ -native bool:SocketBind(Handle:socket, const String:hostname[], port); - -/** - * Connects a socket - * - * @note this native is threaded, it may be still running after it executed, use the connect callback - * @note invokes the SocketError callback with errorType = CONNECT_ERROR or EMPTY_HOST if it fails - * @note invokes the SocketConnect callback if it succeeds - * - * @param Handle socket The handle of the socket to be used. - * @param SocketConnectCB cfunc The connect callback - * @param SocketReceiveCB rfunc The receive callback - * @param SocketDisconnectCB dfunc The disconnect callback - * @param String hostname The hostname (or IP) to connect to. - * @param cell_t port The port to connect to. - * @noreturn - */ -native SocketConnect(Handle:socket, SocketConnectCB:cfunc, SocketReceiveCB:rfunc, SocketDisconnectCB:dfunc, const String:hostname[], port); - -/** - * Disconnects a socket - * - * @note this will not close the handle, the socket will be reset to a state similar to after SocketCreate() - * @note this won't trigger any disconnect/error callbacks - * - * @noreturn - */ -native bool:SocketDisconnect(Handle:socket); - -/** - * Makes a socket listen for incoming connections - * - * @param Handle socket The handle of the socket to be used. - * @param SocketIncomingCB ifunc The callback for incoming connections - * @return bool true on success - */ -native bool:SocketListen(Handle:socket, SocketIncomingCB:ifunc); - -/** - * Sends data through the socket. - * - * @note specify size for binary safe operation - * @note if size is not specified the \0 terminator will not be included - * @note This native is threaded, it may be still running after it executed (not atomic). - * @note Use the SendqueueEmpty callback to determine when all data has been successfully sent. - * @note The socket extension will ensure that the data will be send in the correct order and split - * the data if required. - * - * @param Handle socket The handle of the socket to be used. - * @param String data The data to send. - * @noreturn - */ -native SocketSend(Handle:socket, const String:data[], size=-1); - -/** - * Sends UDP data through the socket to a specific destination. - * - * @note specify size for binary safe operation - * @note if size is not specified the \0 terminator will not be included - * @note This native is threaded, it may be still running after it executed (not atomic). - * @note Use the SendqueueEmpty callback to determine when all data has been successfully sent. - * @note The socket extension will ensure that the data will be send in the correct order and split - * the data if required. - * - * @param Handle socket The handle of the socket to be used. - * @param String data The data to send. - * @param String hostname The hostname (or IP) to send to. - * @param cell_t port The port to send to. - * @noreturn - */ -native SocketSendTo(Handle:socket, const String:data[], size=-1, const String:hostname[], port); - -/** - * Set a socket option. - * - * @param Handle socket The handle of the socket to be used. May be INVALID_HANDLE if not essential. - * @param SocketOption option The option to modify (see enum SocketOption for details). - * @param cellt_ value The value to set the option to. - * @return cell_t 1 on success. - */ -native SocketSetOption(Handle:socket, SocketOption:option, value); - - -/** - * Defines the callback function for when the socket receives data - * - * @note this is only useful and required for child-sockets spawned by listen-sockets - * (otherwise you already set it in SocketConnect()) - * - * @param Handle socket The handle of the socket to be used. - * @param SocketReceiveCB rfunc The receive callback - * @noreturn - */ -native SocketSetReceiveCallback(Handle:socket, SocketReceiveCB:rfunc); - -/** - * Defines the callback function for when the socket sent all items in its send queue - * - * @note this must be called AFTER sending (queueing) the data - * @note if no send-data is queued this will fire the callback itself - * @note the callback is guaranteed to fire - * - * @param Handle socket The handle of the socket to be used. - * @param SocketDisconnectCB dfunc The disconnect callback - * @noreturn - */ -native SocketSetSendqueueEmptyCallback(Handle:socket, SocketSendqueueEmptyCB:sfunc); - -/** - * Defines the callback function for when the socket was properly disconnected by the remote side - * - * @note this is only useful and required for child-sockets spawned by listen-sockets - * (otherwise you already set it in SocketConnect()) - * - * @param Handle socket The handle of the socket to be used. - * @param SocketDisconnectCB dfunc The disconnect callback - * @noreturn - */ -native SocketSetDisconnectCallback(Handle:socket, SocketDisconnectCB:dfunc); - -/** - * Defines the callback function for when the socket triggered an error - * - * @note this is only useful and required for child-sockets spawned by listen-sockets - * (otherwise you already set it in SocketCreate()) - * - * @param Handle socket The handle of the socket to be used. - * @param SocketErrorCB efunc The error callback - * @noreturn - */ -native SocketSetErrorCallback(Handle:socket, SocketErrorCB:efunc); - - -/** - * Sets the argument being passed to callbacks - * - * @param Handle socket The handle of the socket to be used. - * @param any arg The argument to set - * @noreturn - */ -native SocketSetArg(Handle:socket, any:arg); - -/** - * Retrieve the local system's hostname as the command "hostname" does. - * - * @param dest Destination string buffer to copy to. - * @param destLen Destination buffer length (includes null terminator). - * - * @return 1 on success - */ -native SocketGetHostName(String:dest[], destLen); - -/** - * _________________Do not edit below this line!_______________________ - */ -public Extension:__ext_smsock = -{ - name = "Socket", - file = "socket.ext", -#if defined AUTOLOAD_EXTENSIONS - autoload = 1, -#else - autoload = 0, -#endif -#if defined REQUIRE_EXTENSIONS - required = 1, -#else - required = 0, -#endif -};