万事开头难,中间难,后面难。
成功让插件和数据库联系上了,对于数据库操作并不熟悉的我也算是阶段性成果了。
有了数据交互的渠道,就算是通上了路,接下来路上走什么车,房子怎么装修,应该也能水到渠成。
插件实现
目前时简单实现了一个数据库插件,在用户连接服务器时,使用SQLite数据库记录steam_id、用户名字、用户连接服务器的次数、以及最后一次连接的时间。
表结构
表创建代码
CREATE TABLE user_connections (
id INTEGER PRIMARY KEY AUTOINCREMENT,
steamid VARCHAR(32) NOT NULL UNIQUE,
name VARCHAR(64) NOT NULL,
connections INTEGER DEFAULT 0,
last_connect TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
插件代码
#include <sourcemod>
#pragma semicolon 1
#pragma newdecls required
#define PLUGIN_VERSION "1.0"
public Plugin myinfo =
{
name = "16Reverie",
author = "Your Name",
description = "Tracks user connections and stores them in an SQLite database.",
version = PLUGIN_VERSION,
url = "http://yourwebsite.com"
};
Database g_db;
public void OnPluginStart()
{
PrintToServer("连接数据库中***************************************************************************************************************************************************************************************************************************");
char error[255];
// 初始化数据库
if (SQL_CheckConfig("user_connections"))
{
g_db = SQL_Connect("user_connections", true, error, sizeof(error));
if (g_db == null)
{
SetFailState("连接数据库失败: %s", error);
PrintToServer("连接数据库失败: %s", error);
}
}
else
{
SetFailState("Database configuration 'user_connections' not found.");
}
}
public void OnClientAuthorized(int client, const char[] auth)
{
if (IsFakeClient(client)) // 忽略机器人
return;
char steamid[32];
if (!GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)))
{
PrintToChatAll("Failed to get SteamID for client %d", client);
LogError("Failed to get SteamID for client %d", client);
return;
}
char name[MAX_NAME_LENGTH];
GetClientName(client, name, sizeof(name));
// 更新数据库
UpdateUserConnection(steamid, name);
}
void UpdateUserConnection(const char[] steamid, const char[] name)
{
char safe_steamid[64];
char safe_name[MAX_NAME_LENGTH * 2 + 1];
g_db.Escape(steamid, safe_steamid, sizeof(safe_steamid));
g_db.Escape(name, safe_name, sizeof(safe_name));
char query[512];
Format(query, sizeof(query),
"INSERT INTO user_connections (steamid, name, connections, last_connect)\
VALUES ('%s', '%s', 1, CURRENT_TIMESTAMP) \
ON CONFLICT(steamid) DO UPDATE \
SET connections = connections + 1, last_connect = CURRENT_TIMESTAMP, name = '%s'",
safe_steamid, safe_name, safe_name);
if (!SQL_FastQuery(g_db, query))
{
char error[255];
SQL_GetError(g_db, error, sizeof(error));
PrintToChatAll("Failed to update user connection: %s", error);
LogError("Failed to update user connection=====================================================================================: %s", error);
}
else {
PrintToServer("数据库更新成功=====================================================================================");
}
}
public void OnPluginEnd()
{
if (g_db != null)
{
delete g_db;
}
}
请忽略一长串的符号,它存在就肯定有作用,比如在只有两种文字颜色并且充满文字的控制台上找到它。
效果
接下来是总结遇到的一些问题和经验。
总结
求生之路插件出现错误会产生日志,但是日志给到的信息并不多,日志所在:
left4dead2\addons\sourcemod\logs
错误提示:Configuration "user_connections" not found“
原因找不到数据库的配置,解决方法:在left4dead2/addons/sourcemod/configs/databases.cfg
文件中加入数据库配置
"Databases"
{
...
"user_connections"
{
"driver" "sqlite"
"host" "localhost"
"database" "user_connections"
}
}
数据库文件
求生之路的数据库文件放在
left4dead2/addons/sourcemod/data/sqlite
里。数据库的文件后缀需要是
.sq3
,当你的数据库不是这个后缀时,运行插件会自动生成一个空.sq3
的数据库。创建的空数据库会自动执行
left4dead2\addons\sourcemod\configs\sql-init-scripts\sqlite
文件下的同名sql
文件里的命令,一般是创建表的命令(未测试)SQLite的
CURRENT_TIMESTAMP
获得的是GMT时间,而非本地时区的时间。
wl
05 / 07用上了!谢!
From Nginx Proxy Manager 登录出错 Bad gateway