猫史档案馆


【最终版】史上最简单易用的SQL模板,点进来就是赚到!

用户:yee剑走天下yee剑走天下查看:11 回复:31 评论:11 创建时间:2023-03-26T13:18:51


屑剑在广纳大家的想法和意见后(

终于研究出来了sql模板+sql模板配套的排行榜(且远比普通的SQL好用!(确信

在此,感谢XiaoLi、145a、Amc、小宏Xela对屑剑研究过程中提供的想法,思路与代码简化(

目前功能:可以直接新增添保存数据而不用删表、数据可以选择是否保存、排行榜,且SQLite和PostgreSQL都适用!

用法:

PlayerData中的每一个值的第一个数据为初始值,第二个数据为是否需要保存该数据

在PlayerData中直接添加新要保存的数据即可,如要新添为exp的数据,写入exp: [初始值, 是否保存]即可,比如:exp: [0, true],如无需保存直接exp: [0, false]即可。

在CorrespondingName中sql排行榜的数据对应的中文名和中文单位即可

如添加exp,只需要exp: ['点', '经验'],如无需名称如lv类的数据,直接exp: ['经验', '无名称']即可

调用排行榜方法:如果需查看玩家金币(money)的前100排行榜,只需await getTop100('money')即可,以此类推

console.clear();
const PlayerData = {
    money: [1, true],
    lv: [0, true],
    item: [[], true],
    test: ['yee', false]
};
const CorrespondingName = {
    'money': ['枚', '金币'],
    'lv': ['级', '无名称']
};
(async () => {
    await poll(createTable)
})();
async function poll(fn, msg) {
    while (1) {
        try {
            return await fn()
        } catch (e) {
            e.message.includes('timeout') ? world.say(e.message) : world.say(msg || e.stack)
        }
        await sleep(2000)
    }
};
async function createTable() {
    await db.sql`
        CREATE TABLE IF NOT EXISTS "YJZTX" (
            "datas" TEXT NOT NULL,
            "userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL
        )
    `
}
function initPlayer(entity) {
    for (let i in PlayerData) {
        entity[i] = PlayerData[i][0]
    }
};
function getPlayerData(entity) {
    var data = { "name": entity.player.name };
    for (let i in PlayerData) {
        PlayerData[i][1] ? data[i] = entity[i] : null
    };
    return JSON.stringify(data);
};
async function savePlayer(entity) {
    if (!entity.player.userKey) return;
    await db.sql`
        INSERT INTO "YJZTX" (
            "datas", 
            "userKey"
        ) 
        VALUES (
            ${getPlayerData(entity)}, 
            ${entity.player.userKey}
        )
        ON CONFLICT("userKey")
        DO UPDATE SET
        "datas" = excluded."datas"
    `
};
async function loadPlayer(entity) {
    const [data] = await db.sql`SELECT * FROM "YJZTX" WHERE "userKey" = ${entity.player.userKey} LIMIT 1`;
    if (data) {
        var Data = JSON.parse(data.datas);
        for (let i in PlayerData) {
            Data[i] ? entity[i] = Data[i] : entity[i] = PlayerData[i][0]
        }
    } else { 
        initPlayer(entity)
    };
};
async function getTop100(type) {
    var list = [];
    for await (let row of db.sql`SELECT * FROM "YJZTX"`) {
        list.push([JSON.parse(row.datas).name, JSON.parse(row.datas)[type]])
    };
    return list.sort((a, b) => a[1] - b[1]).map((value, num) => {
        return `第${num + 1}名 | ${value[0]} | ${value[1]}${CorrespondingName[type][0]}${CorrespondingName[type][1] != '无名称' ? CorrespondingName[type][1] : ''}`
    })
}
async function deletePlayer(entity) {
    await db.sql`DELETE FROM YJZTX WHERE "userKey" = ${entity.player.userKey}`;
};
world.onPlayerJoin(async ({ entity }) => {
    await loadPlayer(entity);
});
world.onPlayerLeave(async ({ entity }) => {
    await savePlayer(entity)
})

以上为最终版(基本上无任何BUG

制作不易()前后发帖五次(多次修改,简化(喜欢的点个关注吧(

附做出贡献的各位创作者主页链接(排名不分先后):

Amc:box3.codemao.cn/u/AmC

Xiaoli:box3.codemao.cn/u/NewGODXiaoLi

145a:box3.codemao.cn/u/54145a

小宏XeLa:box3.codemao.cn/u/codemao2020


回复

上一页1 页 / 共 2下一页
yee剑走天下yee剑走天下

第五版了(啊真的要令人发疯(

点赞1


评论


yee剑走天下yee剑走天下

yee终于有精帖了(((

点赞1


评论


yee089yee089

qpzc

点赞0


评论


Star_Ink_sansStar_Ink_sans

精!

点赞0


评论


屑羽yee屑羽yee

ddd

点赞0


评论


yee剑走天下yee剑走天下

史上最少人看的精帖(确信

点赞0


评论


仙之鹤仙之鹤

ddd

点赞0


评论


屑羽yee屑羽yee

ddd

点赞0


评论


浮生awa浮生awa

前排!!!!!!!!!!!!!!!!!!!!!

点赞1


评论


Star_Ink_sansStar_Ink_sans

喵d

点赞0


评论


22why22why

wow屑yee剑nb()太nb()

点赞0


评论


屑羽yee屑羽yee

ddd

点赞0


评论


ZNS_哪吒ZNS_哪吒

前排)

点赞0


评论


SCS_user_teLeIed6GGSCS_user_teLeIed6GG

6996

点赞0


评论


神奇代码岛func王清林神奇代码岛func王清林

⒍6666

点赞0


评论


_HHHHHHHHHH__HHHHHHHHHH_

emotion_doge

点赞0


评论


yee剑走天下yee剑走天下

ddd

点赞0


评论


fjskdfjslkdfjskdfjslkd

666

点赞0


评论


小宏XeLa小宏XeLa

喵d

点赞0


评论


yee剑走天下yee剑走天下

小顶一下(为创作节助力(

点赞0


评论


一只皮皮鹏一只皮皮鹏

你参加比赛了吗?

 

点赞0


评论


抬头就是你抬头就是你

顶()

点赞0


评论


AokenAoken

ddd

点赞0


评论


小鹿UUyM小鹿UUyM

收藏!

点赞0


评论


ETO罗辑ETO罗辑

az

点赞0


评论


AokenAoken

报错了怎么办?

center_image

代码:

console.clear();
const PlayerData = {
    money: [1, true],
    lv: [0, true],
    exp:[0,true],
    itemList: [['铁剑'], true],
    test: ['yee', false]
};
const CorrespondingName = {// 在此添加排行榜对应的单位和名称(无名称 则表示不显示名称)
    'money': ['枚', '金币'],
    'lv': ['级', '无名称']
};
(async () => {await poll(createTable)})();
async function poll(fn, msg) {
    while (1) {
        try {
            return await fn()
        } catch (e) {
            e.message.includes('timeout') ? world.say(e.message) : world.say(msg || e.stack)
        }
        await sleep(2000)
    }
};
async function createTable() {
    await db.sql`
        CREATE TABLE IF NOT EXISTS "YJZTX" (
            "datas" TEXT NOT NULL,
            "userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL
        )
    `
}

/**
 * 初始化玩家数据
 * 
 * @param {Box3Entity} entity
 */
function initPlayer(entity) {
    for (let i in PlayerData) {
        entity[i] = PlayerData[i][0]
    }
};

/**
 * 获取玩家数据
 * 
 * @param {Box3Entity} entity
 */
function getPlayerData(entity) {
    var data = { "name": entity.player.name };
    for (let i in PlayerData) {
        PlayerData[i][1] ? data[i] = entity[i] : null
    };
    return JSON.stringify(data);
};

/**
 * 存档
 * 
 * @param {Box3Entity} entity
 */
async function savePlayer(entity) {
    if (!entity.player.userKey) return;
    await db.sql`
        INSERT INTO "YJZTX" (
            "datas", 
            "userKey"
        ) 
        VALUES (
            ${getPlayerData(entity)}, 
            ${entity.player.userKey}
        )
        ON CONFLICT("userKey")
        DO UPDATE SET
        "datas" = excluded."datas"
    `
};

/**
 * 读档
 * 
 * @param {Box3Entity} entity
 */
async function loadPlayer(entity) {
    const [data] = await db.sql`SELECT * FROM "YJZTX" WHERE "userKey" = ${entity.player.userKey} LIMIT 1`;
    if (data) {
        var Data = JSON.parse(data.datas);
        for (let i in PlayerData) {
            Data[i] ? entity[i] = Data[i] : entity[i] = PlayerData[i][0]
        }
    } else { 
        initPlayer(entity)
    };
};

/**
 * 读取榜单前100
*/
async function getTop100(type) {
    var list = [];
    for await (let row of db.sql`SELECT * FROM "YJZTX"`) {
        list.push([JSON.parse(row.datas).name, JSON.parse(row.datas)[type]])
    };
    return list.sort((a, b) => a[1] - b[1]).map((value, num) => {
        return `第${num + 1}名 | ${value[0]} | ${value[1]}${CorrespondingName[type][0]}${CorrespondingName[type][1] != '无名称' ? CorrespondingName[type][1] : ''}`
    })
}

/**
 * 删档
 * 
 * @param {Box3Entity} entity
 */
async function deletePlayer(entity) {
    await db.sql`DELETE FROM YJZTX WHERE "userKey" = ${entity.player.userKey}`;
};

world.onPlayerJoin(async ({ entity }) => {
    await loadPlayer(entity);
});
world.onPlayerLeave(async ({ entity }) => {
    await savePlayer(entity)
})

world.onPress(async({ entity, button }) => {
    if (button == 'action1') {
        const ask = await entity.player.dialog({
            type: 'select',
            title: '测试',
            content: `你目前[${entity.lv}]级\n[${entity.exp}]点经验\n[${entity.money}]枚金币\n背包:[${entity.itemList}]`,
            options: ['点我加等级', '点我加经验', '点我加金币','排行榜']
        });
        if (!ask) return;
        if (ask) {
            if (ask.index <= 2) {
                entity[['lv', 'exp', 'money'][ask.index]]++;
            }if(ask.index == 3){
                await entity.player.dialog({
                    type: 'select',
                    title: '排行',
                    content: await getTop100('money'),
                    options: ['确认']
                });      
            }
        };
    };
});

点赞1


评论


抬头就是你抬头就是你

继续挖

点赞0


评论


无尽之海无尽之海

怎么召唤

点赞0


评论


小鹿UUyM小鹿UUyM

收藏(((

点赞0


评论


风火年华4512风火年华4512

eee

点赞0


评论