用户:
DebugDynamo查看:3 回复:6 评论:3 创建时间:2022-01-15T14:11:27
async function initTable() {//创建玩家数据表
return await db.sql`
CREATE TABLE IF NOT EXISTS "players" (
"posts" INT NOT NULL,
"item" TEXT NOT NULL,--物品列表
"jujin" INT NOT NULL,
"juqlb" TEXT NOT NULL,
"money" INT NOT NULL,
"chufa" TEXT NOT NULL,
"userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL --用户识别码
)
`;
}
async function saveUser(user) {//玩家存档
await db.sql`
INSERT INTO "players" (-- player虽然是小写, 建议统一用""包住
"posts",
"item",-- 道具
"jujin",
"juqlb",-- 道具
"money",
"chufa",-- 道具
"userKey"-- 用户识别码
) VALUES (
${JSON.stringify(user.posts)},
${JSON.stringify(user.item)}, --尝试新建道具值
${user.jujin},
${JSON.stringify(user.juqlb)},
${user.money},
${JSON.stringify(user.chufa)},
${user.player.userKey} --尝试新建当前玩家识别码
)
ON CONFLICT("userKey") -- 如果已经存在同样的用户识别码
DO UPDATE SET
"posts"=excluded."posts",-- 虽然是小写, 建议统一用""包住
"item"=excluded."item",-- 虽然是小写, 建议统一用""包住
"jujin"=excluded."jujin",-- 虽然是小写, 建议统一用""包住
"juqlb"=excluded."juqlb",-- 虽然是小写, 建议统一用""包住
"money"=excluded."money",-- 虽然是小写, 建议统一用""包住
"chufa"=excluded."chufa" -- 虽然是小写, 建议统一用""包住
`
}
async function loadUser(user) {//玩家读档
const [data] = await db.sql`SELECT * FROM "players" WHERE "userKey"=${user.player.userKey} LIMIT 1`
if (data) {//如果这个玩家已经有存档
user.posts = JSON.parse(data.posts)
user.item = JSON.parse(data.item)
user.jujin = data.jujin
user.juqlb = JSON.parse(data.juqlb)
user.money = data.money
user.chufa = JSON.parse(data.chufa)
}
else {//玩家无存档
saveUser(user)
}
}
async function poll(fn) {//无限轮询执行sql语句直到成功
while (true) {
try {
return await fn()//一旦成功执行, 停止无限轮询, 并返回查询结果
} catch (e) {
const m = e.message//需要简略显示的异常消息
//sql偶尔会执行超时, 但如果反复显示timeout 15秒以上一直不停, 大概是数据库出了故障只能等官方修复
if (m.includes('timeout')) {
world.say(m)
}
else {
world.say(e.stack)//如果sql执行出错, 广播错误消息, 用来排查错误原因
}
}
await sleep(2000) //每2秒重试一次
}
}
poll(initTable)
async function cundang(entity){
while(true){
saveUser(entity)
await sleep(1000)
}
}
world.onPlayerJoin(async({entity})=>{
cundang(entity)
})
排版不要没