• Q&A
  • 关于json的一个小问题

心血来潮想通过编写一个lua脚本使用 eventMsg调用原命令 将 群管命令 用汉字替代,但是命令又不能随便谁都可以调用,所以需要一个权限管理表,我打算采用json格式进行数据的存储。想请教大佬这里语法或逻辑有什么大问题吗?下面是关于权限表的内容:
-- 授予权限
function giveUser(msg)
local qq = string.match(msg.fromMsg, "%d+") # 匹配命令中的目标QQ
local permission = string.match(msg.fromMsg, "%s(.-)$") # 权限
local json = require "json"
local j = json.decode(Base.."\\user.json") # BASE = getDiceDir()
j.insert(permission,qq)
local nj = json.encode(j)
file = io.open(Base.."\\user.json", "w")
file:write(nj)
file:close()
return "successful"
end

`
– 权限校验
function checkUser(msg)
local user = msg.fromQQ
local json = require “json”
local j = json.decode(Base..“\user.json”)

local function findQPermission(permission,user)
	for i,v in ipairs(permission) do
		if (user == v)then
			return tostring(permission)
                            ** # 此处应该跳出for循环,本来这里是 break,但是报错了,待完善 **
		end
	end
end

if (findQPermission(j.master) ~= F) then
	return "master"
else
	if (findQPermission(j.admin) ~= F) then
		return "admin"
	else
		return "N"
	end
end

end
`

  • 简律纯 回复了此帖
  • GeMini_V

    一、关于语法

    • 错误
      1. local j = json.decode(Base.."\\user.json")
        json.decode(…)的内容必须是字符串,因此你需要将里面的文件(BASE.. ‘\user.json’)先用io.open读出来。
      2. giveUser(msg)该函数没有end。
      3. 你的break报错原因是这样的:return只能用在block(语句块)结束的地方,不能用在block的一个中间部分。
        如果你想在中间使用,你必须这样:
        do return end
        把return放进do和end间。
    • 纠正
      1. BASEBase,变量名大小写要统一。
      2. 没有j.insert,只有table.insert
      3. 表(table)操作时应该提前定义表以及key——
        permission={}
        这样才可以使用
        table.insert(permission, qq)

    二、关于权限表

    简单的方法有如下几种:

    1. eventMsg的#3填写msg.fromQQ将只允许trust>=4的用户(俗称管理员)使用。
      msg_order={['群内状态']='group_state'}
      
      function group_state(msg)
          eventMsg('.group state', msg.gid, msg.fromQQ)
      end
      这样脚本只允许trust>=4的用户使用,其他用户使用将会回复&strNotAdmin
    2. 正如 タブー術 所说如果想授予权限可以用setUserConf自建一个配置项鸭,在每一个eventMsg外套上一个if判断——
      if(
       getUserConf(msg.fromQQ, key, 0) >= 1
      ) then
       eventMsg(...)
      else
       return
      end
      思路是手动定义一个配置项作为判断能否使用此命令的指标,每次执行eventMsg前判断该用户的key指标是否大于规定值(大于则为管理,反之亦然)。
    3. 正如 タブー術 所说直接取群配置不就好啦
      取群配置,判断是否为管理员以及群主。
      if(
       getGroupConf(msg.gid, 'auth#'..msg.uid, 0)>1
      ) then
       eventMsg(...)
      else
       return 
      end
      但是非常不推荐这种方法,因为这个函数受到框架的影响。

    复杂的简单方法:

    1. 如果你的dice版本在615及以上,那么你可以使用getSelfData()来快速读写json。随后json=require('json')取表格内容再做相应(迭代器)运算:
      for key, values in pairs(tab) do
       if msg.uid == data.user[i] then
        eventMsg(...)
        break
       end
      end
    2. 如果你的版本低于615,那么你可以自己手搓读写json文件,在此提供我常用的一个库,它可以做到table与string与json之间的互转。
      require('tab2str2json')
      tab2str2json.zip
      2kB

    getGroupConf(groupID, keyConf, defaultVal)
    取群配置项,带的配置项会另行计算而非调用存储数据
    auth#群员账号
    群权限(只读) 1-群员;2-管理;3-群主

    直接取群配置不就好啦,如果想授予权限可以用setUserConf自建一个配置项鸭

      GeMini_V

      一、关于语法

      • 错误
        1. local j = json.decode(Base.."\\user.json")
          json.decode(…)的内容必须是字符串,因此你需要将里面的文件(BASE.. ‘\user.json’)先用io.open读出来。
        2. giveUser(msg)该函数没有end。
        3. 你的break报错原因是这样的:return只能用在block(语句块)结束的地方,不能用在block的一个中间部分。
          如果你想在中间使用,你必须这样:
          do return end
          把return放进do和end间。
      • 纠正
        1. BASEBase,变量名大小写要统一。
        2. 没有j.insert,只有table.insert
        3. 表(table)操作时应该提前定义表以及key——
          permission={}
          这样才可以使用
          table.insert(permission, qq)

      二、关于权限表

      简单的方法有如下几种:

      1. eventMsg的#3填写msg.fromQQ将只允许trust>=4的用户(俗称管理员)使用。
        msg_order={['群内状态']='group_state'}
        
        function group_state(msg)
            eventMsg('.group state', msg.gid, msg.fromQQ)
        end
        这样脚本只允许trust>=4的用户使用,其他用户使用将会回复&strNotAdmin
      2. 正如 タブー術 所说如果想授予权限可以用setUserConf自建一个配置项鸭,在每一个eventMsg外套上一个if判断——
        if(
         getUserConf(msg.fromQQ, key, 0) >= 1
        ) then
         eventMsg(...)
        else
         return
        end
        思路是手动定义一个配置项作为判断能否使用此命令的指标,每次执行eventMsg前判断该用户的key指标是否大于规定值(大于则为管理,反之亦然)。
      3. 正如 タブー術 所说直接取群配置不就好啦
        取群配置,判断是否为管理员以及群主。
        if(
         getGroupConf(msg.gid, 'auth#'..msg.uid, 0)>1
        ) then
         eventMsg(...)
        else
         return 
        end
        但是非常不推荐这种方法,因为这个函数受到框架的影响。

      复杂的简单方法:

      1. 如果你的dice版本在615及以上,那么你可以使用getSelfData()来快速读写json。随后json=require('json')取表格内容再做相应(迭代器)运算:
        for key, values in pairs(tab) do
         if msg.uid == data.user[i] then
          eventMsg(...)
          break
         end
        end
      2. 如果你的版本低于615,那么你可以自己手搓读写json文件,在此提供我常用的一个库,它可以做到table与string与json之间的互转。
        require('tab2str2json')
        tab2str2json.zip
        2kB
        说点什么吧...