From aecfdeea552359998969129aebdc35ab75306a6a Mon Sep 17 00:00:00 2001 From: dzp Date: Mon, 5 Dec 2022 11:06:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(lib/storage):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E5=AD=98=E5=82=A8=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用法如下: /* 加载模块 */ load-lib storage; /* 存储数据 */ storage.Save my-data {myvar1;myvar2;myvar3}; /* 提取数据 */ storage.Load my-data {myvar1;myvar2;myvar3}; 数据以 tintin++ 格式默认储存在 data 目录,文件名就是 Save/Load 的第一个参数。 存储位置支持文件重定位,即:如果储存时存在 var/data 目录,则改为储存到 var/data 目录。 如果提取时存在 var/data/my-data.tin 文件中,则改为从该文件获取内容。 用途举例:pp 大米可以通过 storage 来加载和存储黑白名单,优化 pp 大米的利用率。 --- .gitignore | 2 ++ README.md | 7 +++--- plugins/lib/storage.tin | 52 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 plugins/lib/storage.tin diff --git a/.gitignore b/.gitignore index e6305f54..ef4492ff 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ out[1-9] var/* var + +data/* diff --git a/README.md b/README.md index 6331239b..c66d17b9 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ docker run --rm -it --name tt --hostname tt mudclient/paotin mkdir -p $HOME/my-paotin/ # 创建游戏目录结构 -mkdir -p $HOME/my-paotin/{ids,etc,log,plugins} +mkdir -p $HOME/my-paotin/{ids,etc,data,log,plugins} docker run -d -it --name tt --hostname tt -v $HOME/my-paotin:/paotin/var mudclient/paotin daemon ``` @@ -194,7 +194,8 @@ PaoTin++ 大部分模块源码文件都支持重定位,你可以在 `var/` 目 Docker 方式下,可以将本地工作目录 mount 到容器内的 /paotin/var 目录,那么就可以实现容器内外的文件共享。 ``` -mkdir -p $HOME/my-paotin # 先创建一个本地工作目录 +# 先创建一个本地工作目录 +mkdir -p $HOME/my-paotin/{ids,etc,data,log,plugins} docker run -d -it --name tt --hostname tt -v $HOME/my-paotin:/paotin/var mudclient/paotin daemon ``` @@ -213,7 +214,7 @@ ID 配置文件和数据配置文件可分别放置在 `$HOME/my-paotin/ids/` 建议另外新建一个目录,用来存放你的源代码,并将 `var/` 目录通过符号链接指向该目录。例如: ``` -mkdir -p ../my-paotin/{etc,ids,plugins,log} +mkdir -p ../my-paotin/{ids,etc,data,log,plugins} ln -s ../my-paotin var ``` diff --git a/plugins/lib/storage.tin b/plugins/lib/storage.tin new file mode 100644 index 00000000..210e151b --- /dev/null +++ b/plugins/lib/storage.tin @@ -0,0 +1,52 @@ +#nop vim: set filetype=tt:; + +/* +本文件属于 PaoTin++ 的一部分。 +PaoTin++ © 2020~2022 的所有版权均由担子炮(dzp ) 享有并保留一切法律权利 +你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。 +*/ + +#var lib_storage[META] { + {NAME} {通用存储引擎} + {DESC} {可以存储和载入变量,这允许其它模块可以持久化自己的数据} + {AUTHOR} {担子炮} +}; + +#function {lib_storage.Init} { + #local _ {@mkdir{data}}; + #return {true}; +}; + +#alias {storage.Save} { + #local file {%1}; + #local vars {%2}; + + #class comm-store-tmp open; + #local var {}; + #foreach {$vars} {var} { + #var {dump-$var} {${$var}}; + }; + #class comm-store-tmp close; + + #local files {}; + #line quiet #scan dir {var/data/} files; + + #if { &files[] > 0 } { + #class comm-store-tmp write {var/data/${file}.tin}; + }; + #else { + #class comm-store-tmp write {data/${file}.tin}; + }; +}; + +#alias {storage.Load} { + #local file {%1}; + #local vars {%2}; + + #line quiet #class comm-store-tmp {assign} {load-file data/${file}.tin}; + #local var {}; + #foreach {$vars} {var} { + #var {$var} {${dump-$var}}; + }; + #class comm-store-tmp kill; +};