-- Chatrooms v4b -- Based on: Chatrooms v3 by tezlo -- Переведел NRJ (04/03/2006) sTag = "" -- Введите тэг для вашей комнаты. Если не хотите, то не трогайте эту строчку. fChat = "Chatrooms.tbl" -- имя файла БД bAutoLogin = "off" -- По умолчанию AutoLogin Mode (on/off) - если опция включена, то все участники комнаты одновременно будут получать сообщения из нее, независимо от того, был у них открыт приват комнаты или нет. Команда !leave в этом случае будет не доступна. bKey = "on" -- По умолчанию Chatroom Key (on/off) - будет ли при создании комната с ключиком или нет. bLocked = "off" -- По умолчанию Locked Mode (on/off) - В режиме "on" только владелец комнаты сможет добавлять в него участников. В режиме "off" пользователи сами смогут становиться учасниками. -- [Profile number] = value (higher value means more rights) Levels = { [-1] = 1, [3] = 2, [2] = 3, [1] = 4, [0] = 5, } -- Команды Commands = { MakeChat = "mkchat", Away = "away", Leave = "leave", Members = "members", Invite = "invite", Remove = "remove", DelChat = "delchat", AutoLogin = "autologin", Hide = "hide", Lock = "lock", Key = "key", } tAllowed = { [0] = 1, -- master [1] = 0, -- operator [2] = 0, -- vip [3] = 0, -- reg [-1] = 0, -- unreg } Main = function() chatrooms:load(usr,1) end OnExit = function() for i,v in chatrooms.items do SendToAll("$Quit "..i) end end MyINFOArrival = function(user, data) chatrooms:load(user) end ChatArrival = function(user,data) local data = string.sub(data,1,-2) local s,e,cmd = string.find(data,"%b<>%s+%!(%S+)") if cmd and cmd == Commands.MakeChat and tCmds[Commands.MakeChat] then if tCmds[cmd][2] <= Levels[user.iProfile] then return tCmds[cmd][1](user,data), 1 end end end ToArrival = function(user,data) local data = string.sub(data,1,-2) local s,e,to,str = string.find(data, "^$To: (%S+) From: %S+ $%b<> (.*)") if chatrooms.items[to] then local tmp = chatrooms.items[to] local s,e,cmd,args = string.find(str, "^%!(%a+)%s*(.*)$") if cmd and tCmds[cmd] then if tCmds[cmd][2] <= Levels[user.iProfile] then return tCmds[cmd][1](user,data,tmp,to,args), 1 end end if tmp.members[user.sName] then if tmp.members[user.sName] ~= 1 then tmp.members[user.sName] = 1 end tmp:chat(str, user.sName) else local Messager = function() if tmp.locked == "off" then if tmp.autologin == "on" then tmp:chat(str, user.sName) else tmp.members[user.sName] = 1 tmp:chat(user.sName.." вошел в комнату.", to) tmp:chat(str, user.sName) chatrooms:save() end else user:SendPM(to, "Вы не являетесь участником данной чат-комнаты!") end end if next(tmp.groups) then if tAllowed[user.iProfile] == 1 or tmp.groups[user.iProfile] == 1 then Messager() else user:SendPM(to, "Вы не являетесь участником данной чат-комнаты!") end else Messager() end end; return 1 end end NewUserConnected = function(user) for a,b in chatrooms.items do if b.groups[user.iProfile] or b.members[user.sName] then if user.bUserCommand then for i,v in tCmds do if(v[2] <= Levels[user.iProfile]) then user:SendData(v[3]) end end break end end end end OpConnected = NewUserConnected tCmds = { -- Commands Structure: -- [Command] = { function, Lowest Profile that can use this command (check Levels table), RightClick Command}, [Commands.MakeChat] = { function(user, data) local s,e,args = string.find(data, "^%b<>%s+%S+%s*(.*)") local s,e,name,profiles = string.find(args,"(%S+)%s*(.*)") if not s then return user:SendData(frmHub:GetHubBotName(),"*** Ошибка: Введите !"..Commands.MakeChat.." <имя комнаты> [группа]"), 1 elseif chatrooms.items[name] then return user:SendData(frmHub:GetHubBotName(),"*** Ошибка: Комната "..name.." уже существует."), 1 elseif GetItemByName(name) then return user:SendData(frmHub:GetHubBotName(),"*** На хабе есть пользователь с таким ником!"), 1 else if bKey then SendToAll("$OpList "..sTag..name.."$$") else SendToAll("$MyINFO $ALL "..sTag..name.." ".." ".."$ $".." ".." $".." ".."$".."0".."$") end local tmp = chatrooms:new(sTag..name, user.sName, bAutoLogin, bLocked, bKey) string.gsub(profiles, "(%S+)", function(profile) profile = tonumber(profile) or GetProfileIdx(profile) if GetProfileName(profile) then tmp.groups[profile] = 1 end end); tmp:chat("Комната успешно создана!", sTag..name) chatrooms:save() end end, 5, "$UserCommand 1 3 Чат-румы\\Создать чат-рум$<%[mynick]> !"..Commands.MakeChat.." %[line:Имя комнаты] %[line:Группы доступа (unreg, reg, vip, operator, master и т. д.)]|" }, [Commands.Away] = { function(user, data, tmp, to, args) tmp:chat(user.sName.." ушел (away).. "..args, to) tmp.members[user.sName] = 0 end, 1, "$UserCommand 1 3 Чат-румы\\Away$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Away.."|" }, [Commands.Leave] = { function(user, data, tmp, to, args) if tmp.autologin == "off" then tmp.members[user.sName] = nil tmp:chat(user.sName.." покинул комнату. "..args, to) chatrooms:save() chatrooms:load(user) else user:SendPM(to, "Команда не доступна в AutoLogin mode!") end end, 1, "$UserCommand 1 3 Чат-румы\\Уйти$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Leave.."|" }, [Commands.Members] = { function(user, data, tmp, to) local n, na, msg,offline,away,on = 0, 0,"","Offline :\r\n"..string.rep ("=", 20),"Отсутствует (away) :\r\n"..string.rep ("=", 20), "В комнате (online) :\r\n"..string.rep ("=", 20) if tmp.autologin == "on" then if next(tmp.groups) then user:SendPM(to, "Это приватная чат-комната! Только участники комнаты могут в ней переписываться.") else user:SendPM(to, "Это общая чат-комната.") end else for nick, stat in tmp.members do if not GetItemByName(nick) then offline = offline.."\r\n"..nick elseif stat == 0 then away = away.."\r\n"..nick else msg, na = "", na+1 on = on.."\r\n"..nick end; n = n+1 end; user:SendPM(to, "\r\n"..on.."\r\n\r\n"..offline.."\r\n\r\n"..away.."\r\n\r\n"..na.." из "..n.." участников в чат-комнате.") end end, 1, "$UserCommand 1 3 Чат-румы\\Участники$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Members.."|" }, [Commands.Invite] = { function(user, data, tmp, to, args) string.gsub(args, "(%S+)", function(nick) if not tmp.members[nick] then tmp.members[nick] = 1 chatrooms:save() if GetItemByName(nick) then chatrooms:load(GetItemByName(nick)) end tmp:chat(nick.." пришел в чат-комнату. Введите !leave, чтобы покинуть чат или !members, чтобы увидеть всех участников комнаты.", to) end end); end, 5, "$UserCommand 1 3 Чат-румы\\Пригласить$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Invite.." %[line:Введите ник]|" }, [Commands.Remove] = { function(user, data, tmp, to, args) string.gsub(args, "(%S+)", function(nick) if tmp.members[nick] and nick ~= tmp.owner then tmp:chat(nick.." был удален из комнаты", to) tmp.members[nick] = nil chatrooms:save() if GetItemByName(nick) then chatrooms:load(GetItemByName(nick)) end end end); end, 5, "$UserCommand 1 3 Чат-румы\\Удалить участника$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Remove.." %[line:Введите ник]|" }, [Commands.DelChat] = { function(user, data, tmp, to) tmp:chat("Чат-комната была удалена.", to) for _,usr in frmHub:GetOnlineUsers() do if next(tmp.groups) then if tmp.groups[usr.iProfile] or tmp.members[usr.sName] or not tmp.hide[usr.iProfile] then usr:SendData("$Quit "..to) end else SendToAll("$Quit "..to) end end chatrooms.items[to] = nil chatrooms:save() chatrooms:load() end, 5, "$UserCommand 1 3 Чат-румы\\Удалить комнату$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.DelChat.."|" }, [Commands.AutoLogin] = { function(user, data, tmp, to, args) if string.lower(args) == "on" then tmp.autologin = "on" chatrooms:save() user:SendPM(to, "AutoLogin Mode включен.") elseif string.lower(args) == "off" then tmp.autologin = "off" chatrooms:save() user:SendPM(to, "AutoLogin Mode выключен.") else user:SendPM(to, "*** Ошибка: Введите !"..Commands.AutoLogin.." ") end end, 5, "$UserCommand 1 3 Чат-румы\\Set AutoLogin$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.AutoLogin.." %[line:On/Off]|" }, [Commands.Key] = { function(user, data, tmp, to, args) if string.lower(args) == "on" then tmp.key = "$OpList "..to.."$$" chatrooms:save() user:SendPM(to, "Key Mode включен.") elseif string.lower(args) == "off" then tmp.key = "$MyINFO $ALL "..to.." ".." ".."$ $".." ".." $".." ".."$".."0".."$" chatrooms:save() user:SendPM(to, "Key Mode выключен.") else user:SendPM(to, "*** Ошибка: Введите !"..Commands.Key.." ") end end, 5, "$UserCommand 1 3 Чат-румы\\Set Key$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Key.." %[line:On/Off]|" }, [Commands.Lock] = { function(user, data, tmp, to, args) if string.lower(args) == "on" then tmp.locked = "on" chatrooms:save() user:SendPM(to, "Locked Mode включен.") elseif string.lower(args) == "off" then tmp.locked = "off" chatrooms:save() user:SendPM(to, "Locked Mode выключен.") else user:SendPM(to, "*** Ошибка: Введите !"..Commands.Lock.." ") end end, 5, "$UserCommand 1 3 Чат-румы\\Set Lock$$To: %[line:Введите название комнаты] From: %[mynick] $<%[mynick]> !"..Commands.Hide.." %[line:On/Off]|" }, [Commands.Hide] = { function(user, data, tmp, to, args) if args then if string.lower(args) == "off" then tmp.hide = {} user:SendPM(to, "Hide Mode отключен. Все группы пользователей могут видеть чат-комнату.") else string.gsub(args, "(%S+)", function(profile) if tmp.groups[profile] then user:SendPM(to, "This group is immune to hide.") return 0 end if string.lower(profile) == "unreg" or profile == "-1" then tmp.hide[-1] = 1 end profile = tonumber(profile) or GetProfileIdx(profile) if GetProfileName(profile) then tmp.hide[profile] = 1 end end) user:SendPM(to, args.." были добавлены в "..to.."'s Profile Hiding List.") end chatrooms:save() chatrooms:load() else user:SendPM(to, "*** Ошибка: Введите !"..Commands.Hide.." [groups]") end end, 5, "$UserCommand 1 3 Чат-румы\\Set Hide$$To: %[line:Chatroom] From: %[mynick] $<%[mynick]> !"..Commands.Hide.." %[line:Profiles (unreg, reg, vip, operator, master и т. д.)]|" }, } botchat = function(self, msg, from) if self.autologin == "on" then if next(self.groups) then for _,user in frmHub:GetOnlineUsers() do if (self.groups[user.iProfile] or self.members[user.sName]) and user.sName ~= from and self.members[user.sName] ~= 0 then SendToNick(user.sName, "$To: "..user.sName.." From: "..self.name.." $<"..from.."> "..msg) end end else for _,user in frmHub:GetOnlineUsers() do if user.sName ~= from and self.members[user.sName] ~= 0 then SendToNick(user.sName, "$To: "..user.sName.." From: "..self.name.." $<"..from.."> "..msg) end end end else for nick,id in self.members do if nick ~= from and id == 1 then SendToNick(nick, "$To: "..nick.." From: "..self.name.." $<"..from.."> "..msg) end end end end chatrooms = { new = function(self, name, owner, autologin, locked, key) if key == "on" then key = "$OpList "..name.."$$" else key = "$MyINFO $ALL "..name.." ".." ".."$ $".." ".." $".." ".."$".."0".."$" end local tmp = { name = name, owner = owner, autologin = autologin, key = key, hide = {}, locked = locked, groups = {}, members = { [owner] = 1 }, chat = botchat }; self.items[name] = tmp return tmp end, load = function(self,user,bLoad) if bLoad then if loadfile(fChat) then self.items = dofile(fChat) else local f = io.open(fChat, "w+") f:write("return {\n"); f:write("}"); f:close() self.items = dofile(fChat) end end local function bMember(usr,room) if usr then if (room.groups[usr.iProfile]) or (usr.sName == room.owner) or (room.members[usr.sName] and(room.members[usr.sName] ~= 2)) or (not(room.hide[usr.iProfile])) then usr:SendData(room.key) return 1 else usr:SendData("$Quit "..room.name) return 1 end end end for sName,room in chatrooms.items do -- room:chat("Hello", name) room.chat = botchat if next(room.hide) then if not(bMember(user,room)) then for i,v in frmHub:GetOnlineUsers() do bMember(v,room) end end else if user then if user.sName == room.name then user:Disconnect() return 0 end -- drop user if nick==chatbot user:SendData(room.key) else SendToAll(room.key) end end end end, save = function(self) local f = io.open(fChat, "w+") f:write("return {\n"); for name, tmp in self.items do f:write(string.format("\t[%q] = {\n\t\tname = %q,\n\t\towner = %q,\n\t\tautologin = %q,\n\t\tlocked = %q,\n\t\tkey = %q,".. "\n\t\tgroups = {\n", name, tmp.name, tmp.owner, tmp.autologin,tmp.locked,tmp.key)) for id, stat in tmp.groups do f:write(string.format("\t\t\t[%d] = %d,\n", id, stat)) end; f:write("\t\t},\n\t\tmembers = {\n") for nick, stat in tmp.members do f:write(string.format("\t\t\t[%q] = %d,\n", nick, stat)) end; f:write("\t\t},\n\t\thide = {\n"); for user, stat in tmp.hide do f:write(string.format("\t\t\t[%d] = %d,\n", user, stat)) end; f:write("\t\t}\n\t},\n"); end; f:write("}"); f:close() end }-- HighCard by Madman tConfig = { ["Bot"] = { ["Name"] = "Карты", ["Descr"] = "[ИГРА] Наберите в приват !start ;_)" }, ["File"] = "HighCard.dat" } function Main() frmHub:RegBot(tConfig.Bot.Name, 1, tConfig.Bot.Descr, "") -- Create file local file = io.open(tConfig.File) if file then file:close() else local file = io.open(tConfig.File, "w+") file:write("Players = {\n}") file:close() end -- Load it LoadFromFile(tConfig.File) end function ToArrival(curUser, data) local data = string.sub(data, 1, -2) local s,e,To,From = string.find(data, "$To:%s+(%S+)%s+From:%s(%S+)") if To == tConfig.Bot.Name then local s,e,cmd = string.find(data, "%b<>%s+%p(%w+)") if cmd then local tCmds = { ["help"] = function(curUser, data) curUser:SendPM(tConfig.Bot.Name, "Это очень простая игра, в которой Вам предстоит сразиться с ботом.\r\n".. "Введите !start для начала игры. Затем выберете размер ваших ставок командой !bet <№>.\r\n".. "Затем используйте команду !hit, чтобы вытащить карту больше, чем у бота.\r\n".. "Если у вас Туз, то вы автоматически выигрываете.\r\n".. "Введите !stop, чтобы покинуть игру или !bank, чтобы проверить сколько у вас денег.") end, ["start"] = function(curUser, data, To, From) if Players[curUser.sName] == nil then Players[curUser.sName] = {} Players[curUser.sName]["Cash"] = {} Players[curUser.sName]["Playing"] = {} Players[curUser.sName]["Cash"] = 500 Players[curUser.sName]["Playing"] = 1 else Players[curUser.sName]["Playing"] = 1 end SaveToFile(tConfig.File, Players, "Players") curUser:SendPM(tConfig.Bot.Name, "\r\nИгра началась!\r\n".. "Банк выделяет вам " ..Players[curUser.sName]["Cash"].. " $ для начала игры.\r\n".. "Если вы играете впервые, то введите !help ") end, ["hit"] = function(curUser, data, To, From) if Players[curUser.sName]["Playing"] == 1 and Players[curUser.sName]["Bet"] then DealCard(curUser) elseif Players[curUser.sName]["Playing"] == 1 and Players[curUser.sName]["Bet"] == nil then curUser:SendPM(tConfig.Bot.Name, "Для начала вы должны определить размер ставки!") else curUser:SendPM(tConfig.Bot.Name, "Вы не играете! Введите !start для начала игры.") end end, ["bet"] = function(curUser, data, To, From) local s,e,Bet = string.find(data, "%b<>%s+%S+%s+(%d+)") if (Players[curUser.sName]["Playing"] == 1) then if Bet then Bet = tonumber(Bet) if Bet > Players[curUser.sName]["Cash"] then curUser:SendPM(tConfig.Bot.Name, "У вас нет столько денег!") return 1 end if Bet == 0 then curUser:SendPM(tConfig.Bot.Name, "Нельзя ничего не ставить!") return 1 end if Players[curUser.sName]["Bet"] == nil then Players[curUser.sName]["Bet"] = {} Players[curUser.sName]["Bet"] = Bet else Players[curUser.sName]["Bet"] = Bet end SaveToFile(tConfig.File, Players, "Players") curUser:SendPM(tConfig.Bot.Name, "Величина вашей ставки, равная (" ..Bet.. ") $, была сохранена.") else curUser:SendPM(tConfig.Bot.Name, "Введите: !bet <№>") end else curUser:SendPM(tConfig.Bot.Name, "Вы не играете сейчас.") end end, ["stop"] = function(curUser, data, To, From) if (Players[curUser.sName]["Playing"] == 1) then Players[curUser.sName]["Playing"] = 0 Players[curUser.sName]["Bet"] = nil SaveToFile(tConfig.File, Players, "Players") curUser:SendPM(tConfig.Bot.Name, "\r\nВы остановили игру.\r\n".. "Сумма ваших сбережений была отправлена в банк, размер ставок обнулился.\r\n".. "Вы сможете установить размер ставок как только возобновите игру!") else curUser:SendPM(tConfig.Bot.Name, "Вы не играете сейчас.") end end, ["bank"] = function(curUser, data, To, From) if Players[curUser.sName] then curUser:SendPM(tConfig.Bot.Name, "У вас " ..Players[curUser.sName]["Cash"].. " $ !!!") else curUser:SendPM(tConfig.Bot.Name, "У вас нет денег, т. к. вы еще ни разу не играли!") end end, } if tCmds[cmd] then return tCmds[cmd](curUser, data, To, From) end end end end function DealCard(curUser) Msg,PlayerMsg,BotMsg = "\r\n","","" -- Bot's Card Card() -- Get us some cards BotMsg = "Карта бота: " ..CardValue.. " " ..Color Bot = Value -- Get the card's value CardValue = tostring(CardValue) BotCard = CardValue.. " " ..Color -- Player's Card Card() PlayerMsg = "\r\nВаша карта: " ..CardValue.. " " ..Color Player = Value CardValue = tostring(CardValue) PlayerCard = CardValue.. " " ..Color -- New Bot Card if PlayerCard == BotCard then -- If they got the same color and number Card() -- Get new card 4 bot BotMsg = "Карта бота: " ..CardValue.. " " ..Color CardValue = tostring(CardValue) BotCard = CardValue.. " " ..Color Bot = Value end Msg = Msg..BotMsg..PlayerMsg Msg = Msg.."\r\n\r\n" if Player == 14 then -- If player got Ace, he wins Players[curUser.sName]["Cash"] = Players[curUser.sName]["Cash"] + Players[curUser.sName]["Bet"] Msg = Msg.."Вы выиграли!\r\nТеперь у вас " ..Players[curUser.sName]["Cash"].. " $ !" else -- If not if Player == Bot then -- It's a tie, no win/loose on cash Msg = Msg.."Ничья! Вы сохранили свои деньги, поэтому у вас все еще " ..Players[curUser.sName]["Cash"].. " $" elseif Player > Bot then -- If Player got higher card then Bot, he wins Players[curUser.sName]["Cash"] = Players[curUser.sName]["Cash"] + Players[curUser.sName]["Bet"] Msg = Msg.."Вы выиграли!\r\nТеперь у вас " ..Players[curUser.sName]["Cash"].. " $ !" elseif Player < Bot then -- If Bot got higher card then Player, Bot wins Players[curUser.sName]["Cash"] = Players[curUser.sName]["Cash"] - Players[curUser.sName]["Bet"] Msg = Msg.."Вы проиграли! :(\r\n" if Players[curUser.sName]["Cash"] <= 0 then -- If Cash - Bet = 0 or -X then player is delted from table Msg = Msg.."Вы остались без гроша! Ваш денежный лимит исчерпан... Попробуйте испытать удачу в следующий раз!.\r\nВаша карьера карточного игрока закончена!" Players[curUser.sName] = nil else Msg = Msg.."Бот забирает у вас сумму, равную вашей ставке. Теперь у вас " ..Players[curUser.sName]["Cash"].. " $" end end end SaveToFile(tConfig.File, Players, "Players") curUser:SendPM(tConfig.Bot.Name, Msg) end function Card() Color = CardColor[math.random(table.getn(CardColor))] Value = math.random(2,14) if Value == 11 then CardValue = "Валет" elseif Value == 12 then CardValue = "Дама" elseif Value == 13 then CardValue = "Король" elseif Value == 14 then CardValue = "Tуз" else CardValue = Value end end CardColor = { "пики", "черви", "бубей", "треф", } -- Serialize by nErBoS function Serialize(tTable, sTableName, sTab) assert(tTable, "tTable equals nil"); assert(sTableName, "sTableName equals nil"); assert(type(tTable) == "table", "tTable must be a table!"); assert(type(sTableName) == "string", "sTableName must be a string!"); sTab = sTab or ""; sTmp = "" sTmp = sTmp..sTab..sTableName.." = {\n" for key, value in tTable do local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key); if(type(value) == "table") then sTmp = sTmp..Serialize(value, sKey, sTab.."\t"); else local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value); sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue end sTmp = sTmp..",\n" end sTmp = sTmp..sTab.."}" return sTmp end function SaveToFile(file , table , tablename) local handle = io.open(file,"w+") handle:write(Serialize(table, tablename)) handle:flush() handle:close() end function LoadFromFile(filename) local f = io.open(filename) if f then local r = f:read("*a") f:flush() f:close() local func,err = loadstring(r) if func then x,err = pcall(func) end end end