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