This one is not very long, but has some tables. Much obliged!
bots = {}
function Main()
loadchat()
for name, users in bots do
frmHub:RegBot(name)
end
end
function OnExit()
savechat()
end
function DataArrival(user, data)
if strsub(data, 1, 1) == "<" then
local s, e, cmd, args = strfind(data, "^%b<> %!(%a+)%s*(.*)|$")
if cmd == "mkchat" and user.bOperator then mkchat(user, args) return 1 end
elseif strsub(data, 1, 4) == "$To:" then
local s, e, to, str = strfind(data, "^$To: (%S+) From: %S+ $%b<> (.*)|$")
if bots[to] then
if not tfind(bots[to], user.sName) then
user:SendPM(to, "youre not a member here") return
end
local isowner = user.sName == bots[to][1]
local s, e, cmd, args = strfind(str, "^%!(%a+)%s*(.*)$")
if cmd == "leave" then leave(user, to)
elseif cmd == "members" then members(user, to)
elseif cmd == "delchat" and isowner then delchat(user, to)
elseif cmd == "invite" and isowner then invite(user, args, to)
elseif cmd == "remove" and isowner then remove(user, args, to)
else dochat(to, user.sName, str) end
end
end
end
function loadchat()
bots = dofile("chatrooms.dat") or {}
end
function savechat()
local f = openfile("chatrooms.dat", "w+")
assert(f, "chatrooms.dat")
write(f, "return {\n")
for name, users in bots do
write(f, "\t"..format("[%q]", name).." = { ")
for i = 1, getn(users) do write(f, format("%q", users[i])..", ") end
write(f, "},\n")
end write(f, "}") closefile(f)
end
function dochat(to, from, str)
local users = bots[to]
for i = 1, getn(users) do
local nick = users[i]
if nick ~= from then SendToNick(nick, "$To: "..nick.." From: "..to.." $<"..from.."> "..str) end
end
end
function mkchat(user, args)
local s, e, name, members = strfind(args, "(%S+)%s*(.*)")
if not s then user:SendData(">> syntax: !mkchat [userlist]") return end
if bots[name] then user:SendData(">> "..name.." belongs to "..bots[name][1]) return end
frmHub:RegBot(name) bots[name] = { user.sName }
invite(user, members, name) dochat(name, name, "hello")
end
function delchat(user, to)
dochat(to, to, "bye bye")
frmHub:UnregBot(to)
bots[to] = nil
end
function leave(user, to)
local id = tfind(bots[to], user.sName)
if id == 1 then user:SendPM(to, "you cant")
else dochat(to, to, user.sName.." has left the room") tremove(bots[to], id) end
end
function members(user, to)
local users = bots[to]
for i = 1, getn(users) do user:SendPM(to, i..". "..users[i]) end
end
function invite(user, args, to)
local n = 0
gsub(args, "(%S+)", function(nick)
local tmp, bool = GetItemByName(nick), tfind(bots[%to], nick)
if tmp and not bool then
tinsert(bots[%to], nick)
dochat(%to, %to, nick.." has been invited to the room")
end
end)
end
function remove(user, args, to)
gsub(args, "(%S+)", function(nick)
local id = tfind(bots[%to], nick)
if id and id ~= 1 then
dochat(%to, %to, nick.." has been removed from the room")
tremove(bots[%to], id)
end
end)
end
function tfind(table, item)
for key, value in table do
if value == item then return key end
end
end
Here try this it is a fast convert in Notepad, I Am not home...
bots = {}
function Main()
loadchat()
for name, users in bots do
frmHub:RegBot(name)
end
end
function OnExit()
savechat()
end
function ChatArrival(user, data)
local s, e, cmd, args = string.find(data, "^%b<> %!(%a+)%s*(.*)|$")
if cmd == "mkchat" and user.bOperator then mkchat(user, args) return 1 end
end
function ToArrival(user,data)
local s, e, to, str = string.find(data, "^$To: (%S+) From: %S+ $%b<> (.*)|$")
if bots[to] then
if not tfind(bots[to], user.sName) then user:SendPM(to, "youre not a member here") return end
local isowner = user.sName == bots[to][1]
local s, e, cmd, args = string.find(str, "^%!(%a+)%s*(.*)$")
if cmd == "leave" then leave(user, to)
elseif cmd == "members" then members(user, to)
elseif cmd == "delchat" and isowner then delchat(user, to)
elseif cmd == "invite" and isowner then invite(user, args, to)
elseif cmd == "remove" and isowner then remove(user, args, to)
else dochat(to, user.sName, str) end
end
end
function loadchat()
bots = dofile("chatrooms.dat") or {}
end
function savechat()
local f = io.open("chatrooms.dat", "w+")
assert(f, "chatrooms.dat")
f:write("return {\n")
for name, users in bots do
f:write("\t"..string.format("[%q]", name).." = { ")
for i = 1, table.getn(users) do f:write(string.format("%q", users[i])..", ") end
f:write("},\n")
end
f:write("}")
f:close()
end
function dochat(to, from, str)
local users = bots[to]
for i = 1, table.getn(users) do
local nick = users[i]
if nick ~= from then SendToNick(nick, "$To: "..nick.." From: "..to.." $<"..from.."> "..str) end
end
end
function mkchat(user, args)
local s, e, name, members = string.find(args, "(%S+)%s*(.*)")
if not s then user:SendData(">> syntax: !mkchat [userlist]") return end
if bots[name] then user:SendData(">> "..name.." belongs to "..bots[name][1]) return end
frmHub:RegBot(name) bots[name] = { user.sName }
invite(user, members, name) dochat(name, name, "hello")
end
function delchat(user, to)
dochat(to, to, "bye bye")
frmHub:UnregBot(to)
bots[to] = nil
end
function leave(user, to)
local id = tfind(bots[to], user.sName)
if id == 1 then user:SendPM(to, "you cant")
else dochat(to, to, user.sName.." has left the room") table.remove(bots[to], id) end
end
function members(user, to)
local users = bots[to]
for i = 1, table.getn(users) do user:SendPM(to, i..". "..users[i]) end
end
function invite(user, args, to)
local n = 0
string.gsub(args, "(%S+)", function(nick)
local tmp, bool = GetItemByName(nick), tfind(bots[to], nick)
if tmp and not bool then
table.insert(bots[to], nick)
dochat(to, to, nick.." has been invited to the room")
end
end)
end
function remove(user, args, to)
string.gsub(args, "(%S+)", function(nick)
local id = tfind(bots[to], nick)
if id and id ~= 1 then
dochat(to, to, nick.." has been removed from the room")
table.remove(bots[to], id)
end
end)
end
function tfind(table, item)
for key, value in table do
if value == item then return key end
end
end
Enjoy!
Checking in later to see if there is some errors....
Seems to work as expected.. I bow to your speediness and mad lua skillz :-)