Asioron

bot

Dec 22nd, 2018
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 15.28 KB | None | 0 0
  1. local event = require('event')
  2. _G.com = require('computer')
  3. _G.c = require('component')
  4.  
  5. local function logToFile(sms) --логирование
  6.   if true then --если логирование не надо, сменить на false
  7.     local f = io.open('/bot/LOG.txt','a')
  8.     f:write(sms..'\n')
  9.     f:close()
  10.   end
  11. end
  12.  
  13. logToFile('#######БОТ#ЗАПУСК#######')
  14. if c.isAvailable("robot") then
  15.   _G.r = require('robot')
  16.   logToFile('Работаем на роботе. Библиотека робота подключена')
  17. end
  18. _G.fl = require('filesystem')
  19.  
  20. if not fl.exists('/bot') then
  21.   logToFile('Дирректория бота не найдена! Создаем...')
  22.   logToFile(tostring(fl.makeDirectory('/bot')))
  23. end
  24. if fl.exists('/bot/imodem.lua') then
  25.   logToFile('Запуск библиотеки моста')
  26.   os.execute('/bot/imodem.lua')
  27. else
  28.   print('Отсутствует библиотека imodem. Выполняю автоскачивание.')
  29.   logToFile('Автоскачивание библиотеки моста')
  30.   os.execute('pastebin get -f MvR7FTGS /bot/imodem.lua')
  31.   logToFile('Запуск библиотеки моста')
  32.   os.execute('/bot/imodem.lua')
  33. end
  34.  
  35. local function curPhrase(line) --вырезка фразы с разделителем
  36.   local t = {}
  37.   if line and line ~= '\n' then
  38.     repeat
  39.       t[#t+1] = string.sub(line, 1, string.find(line, ';')-1)
  40.       line = string.sub(line, string.find(line, ';')+1, string.len(line))
  41.     until #line == 0
  42.   end
  43.   return t
  44. end
  45.  
  46. local function writeConfigFile(type) --перезапись/обновление настроек
  47.   if type then
  48.     logToFile('@ Перезапись файлов конфигурации до базового уровня')
  49.     f = io.open('/bot/bot.cfg', 'w')
  50.     f:write('Bot setup file;\n')
  51.     f:write('Whitelist;'..'\n')
  52.     f:write('User Id;'..'\n')
  53.     f:write('Bot call symbol;~;\n')
  54.     f:close()
  55.     logToFile('@ Перезапись завершена')
  56.   else
  57.     logToFile('@ Обновление файлов конфигурации')
  58.     local f = io.open('/bot/bot.cfg', 'w')
  59.     f:write('Bot setup file;\n')
  60.     local vr = ''
  61.     for i=1, #setting.Wlist do
  62.       vr = vr..setting.Wlist[i]..';'
  63.     end
  64.     f:write('Whitelist;'..vr..'\n')
  65.     logToFile('Запись > '..'Whitelist;'..vr)
  66.     vr = ''
  67.     for i=1, #setting.userId do
  68.       vr = vr..setting.userId[i]..';'
  69.     end
  70.     f:write('User Id;'..tostring(vr)..'\n')
  71.     logToFile('Запись > '..'User Id;'..vr)
  72.     f:write('Bot call symbol;'..setting.sym..';\n')
  73.     logToFile('Запись > '..'Bot call symbol;'..setting.sym)
  74.     f:close()
  75.     logToFile('@ Обновление файлов конфигурации завершено!')
  76.   end
  77. end
  78.  
  79. local function readConfigFile() --чтение настроек
  80.   if not fl.exists('/bot/bot.cfg') then
  81.     logToFile('Файл конфигурации не найден!')
  82.     writeConfigFile(true)
  83.   end
  84.   logToFile('@ Чтение файла конфигурации')
  85.   local f = io.open('/bot/bot.cfg', 'r')
  86.   local line = f:read()
  87.   logToFile(line..'| информационная')
  88.   local vr = curPhrase(f:read())
  89.   logToFile(#vr..'| объем ников')
  90.   setting.Wlist = {}
  91.   for i=2, #vr do
  92.     logToFile('| '..vr[i])
  93.     setting.Wlist[#setting.Wlist+1] = vr[i]
  94.   end
  95.   logToFile(#setting.Wlist..'| объем ников в памяти')
  96.   vr = curPhrase(f:read())
  97.   logToFile(#vr..'| объем паролей')
  98.   setting.userId = {}
  99.   for i=2, #vr do
  100.     logToFile('| '..vr[i])
  101.     setting.userId[#setting.userId+1] = tonumber(vr[i])
  102.   end
  103.   logToFile(#setting.userId..'| объем паролей в памяти')
  104.   vr = curPhrase(f:read())
  105.   logToFile(#vr..'| объем символов')
  106.   setting.sym = {}
  107.   setting.sym = tostring(vr[2])
  108.   logToFile(setting.sym..'| тип символа')
  109.   f:close()
  110.   logToFile('@ Чтение файла конфигурации завершено')
  111. end
  112.  
  113. local function charSearch(sms) --поиск символа с отделением кода
  114.   if sms and string.sub(sms, 1, string.len(setting.sym)) == setting.sym then
  115.     return string.sub(sms, string.len(setting.sym)+1, string.len(sms))
  116.   else
  117.     return false
  118.   end
  119. end
  120.  
  121. local function tim()
  122.   if com.uptime() >= (60*60)*5 then
  123.     imodem.broadcast('Перезагрузка!')
  124.     logToFile('#######РЕСТАРТ#######')
  125.     com.shutdown(true)
  126.   else
  127.     imodem.broadcast('Время работы: '..os.date("%H:%M", math.ceil(com.uptime())-1))
  128.     logToFile('Время работы: '..os.date("%H:%M", math.ceil(com.uptime())-1))
  129.   end
  130. end
  131.  
  132. local function runCode(code)
  133.   local chunk, err = load(code)
  134.   if not chunk then
  135.     return false, err -- load вернул ошибку
  136.   end
  137.   local success, returnValue = pcall(chunk)
  138.   if not success then
  139.     return false, returnValue -- pcall поймал ошибку
  140.   end
  141.   return true, returnValue -- всё хорошо, ошибок нет
  142. end
  143.  
  144. local function checkWhitelist(name, id, type) --проверка по нику. Если нету в вайтлисте то фиг сработает
  145.   if #setting.Wlist == 0 then --данные на вход(имя, пароль, проверить пароль?)
  146.     return true
  147.   end
  148.   for i=1, #setting.Wlist do
  149.     if setting.Wlist[i] == name then
  150.       if not type then --проверка по нику по id не проверяет
  151.         return true, i
  152.       else
  153.         if setting.userId[i] == id then --проверка по id и нику
  154.           return true
  155.         end
  156.       end
  157.     end
  158.   end
  159.   return false
  160. end
  161.  
  162. local function tempAcc(name) --Временный доступ
  163.   if #setting.Wlist == 0 then
  164.     return true
  165.   end
  166.   for i=1,#tempName do
  167.     if tempName[i] == name then
  168.       return true
  169.     end
  170.   end
  171.   return false
  172. end
  173.  
  174. local a={}
  175. local function send(data) --умная пересылка. Откуда получит запрос, туда и отправит
  176.   if a[5] == imodem.channel then
  177.     imodem.broadcast(data)
  178.   else
  179.     imodem.send(a[3], data)
  180.   end
  181. end
  182.  
  183. local function helpCommand(sms)
  184.   sms = string.sub(sms, 3, string.len(sms))
  185.   print(sms)
  186.   if sms == 'exit' then
  187.     send('Выход из программы. Система продолжит свою работу. Мост будет недоступен')
  188.   elseif sms == 'update' then
  189.     send('Выполняет обновление программы бота')
  190.   elseif sms == 'time' then
  191.     send('Возвращает время работы бота')
  192.   elseif sms == 'reboot' then
  193.     send('Перезагрузка бота с аварийным выходом из программы')
  194.   elseif sms == 'useradd' then
  195.     send('Добавить нового пользователя. Формат записи [useradd <новый пользователь> <ваш ID>]. Соблюдайте конфиденциальность и присылайте данное сообщение в личку! Регистрируемый пользователь должен быть в сети!')
  196.   elseif sms == 'userdel' then
  197.     send('Удалить указанного пользователя из доступа к боту. Формат записи [userdel <уничтожаемый пользователь> <ваш ID>]. Соблюдайте конфиденциальность и присылайте данное сообщение в личку!')
  198.   elseif sms == 'help' then
  199.     send('Основная информация по боту')
  200.   elseif sms == 'users' then
  201.     send('Вывод информации по всем зарегистрированным пользователям')
  202.   elseif sms == 'identify' then
  203.     send('Авторизация в боте, чтобы подтвердить что у вас не украли ваш ник. Для авторизации введите "/msg <Name_bot> identify <password>"')
  204.   else
  205.     send('Команда не опознана. Для вывода общей справки введите "'..setting.sym..'help". Для вывода справки по функции введите "? <command>"')
  206.   end
  207. end
  208.  
  209. function message(...)
  210.   a = {...} --3 ник 5 тип приема 6 сообщение
  211.   local sms = charSearch(a[6])
  212.   if sms then
  213.     if checkWhitelist(a[3]) then
  214.       --print('> '..sms) --закомментировать для скрытной работы
  215.     else
  216.       sms = false
  217.     end
  218.   end
  219.   logToFile(a[3]..' << '..sms)
  220.   if string.sub(sms, 1, 1) == '?' then
  221.     helpCommand(sms)
  222.     sms = false
  223.   end
  224.  
  225.   if sms and tempAcc(a[3]) then --команды для авторизованных
  226.     if sms == 'exit' then
  227.       send('IRC мост остановлен! Для восстановления связи перезагрузите вручную бота.')
  228.       imodem.stop()
  229.       os.exit()
  230.     elseif sms == 'update' then
  231.       send('Выполняю скачивание последнего обновления бота ...')
  232.       if not fl.exists('/bot') then
  233.         fl.makeDirectory('/bot')
  234.       end
  235.       os.execute('pastebin get -f Wm7H7Nb4 /bot/bot.lua')
  236.       os.execute('pastebin get -f MvR7FTGS /bot/imodem.lua')
  237.       send('Обновление загружено, перезагрузка.')
  238.       com.shutdown(true)
  239.     elseif sms == 'reboot' then
  240.       send('Аварийная перезагрузка!')
  241.       imodem.stop()
  242.       com.shutdown(true)
  243.     elseif string.find(sms, 'userdel') then
  244.       local _, vr = string.find(sms, 'userdel')
  245.       sms = string.sub(sms, vr+2, string.len(sms))
  246.       local userId, oldUser
  247.       if string.len(sms)>0 then --проверка на ввод нового ника
  248.         oldUser = string.sub(sms, 1, string.find(sms, ' ')-1)
  249.         local _, vr = string.find(sms, ' ')
  250.         if vr then --проверка на id
  251.           sms = string.sub(sms, vr+1, string.len(sms))
  252.           userId = tonumber(string.sub(sms, 1, string.len(sms)))
  253.           sms = false
  254.         else
  255.           send('Забыли ввести свой уникальный номер!')
  256.         end
  257.       else
  258.         send('Некорректный ввод! Для вывода справки по команде перед командой добавьте "?"')
  259.       end
  260.       if oldUser and userId then
  261.         if checkWhitelist(oldUser) then
  262.           if checkWhitelist(a[3], userId, true) then
  263.             local _, num = checkWhitelist(oldUser)
  264.             table.remove(setting.Wlist, num)
  265.             table.remove(setting.userId, num)
  266.             writeConfigFile()
  267.             send('Пользователь '..oldUser..' испепелен!')
  268.             imodem.send(oldUser,'К сожалению вы потеряли доступ к боту. Прощайте...')
  269.           else
  270.             send('Ваш ID введен некорректно')
  271.           end
  272.         else
  273.           send('А зачем ты удаляешь того, кого и так доступа то нет?')
  274.         end
  275.       end
  276.       sms = false
  277.     end
  278.   end
  279.  
  280.   if sms then
  281.     if sms == 'time' then
  282.       tim()
  283.       sms = false
  284.     elseif sms == 'users' then
  285.       local vr = ''
  286.       for i=1, #setting.Wlist do
  287.         vr = vr..setting.Wlist[i]..' '
  288.       end
  289.       if vr == '' then
  290.         send('Доступ разрешен всем!')
  291.       else
  292.         send('Список пользователей, которым разрешен доступ:')
  293.         send(vr)
  294.       end
  295.       sms = false
  296.     elseif sms == 'help' then
  297.       send('Я бот который находится в Minecraft. Можете мною управлять при помощи командной строки. Я понимаю все команды которые начинаются со знака '..setting.sym..'')
  298.       send('Для авторизации введите "/msg <Name_bot> identify <password>"')
  299.       send('Доступные команды без авторизации: help, time, useradd, users')
  300.       send('После авторизации вам будут доступно управление ботом и команды: identify  userdel, update, exit, reboot, identify')
  301.       send('Глобальные компоненты: computer = (com), component = (c), robot = (r), filesystem = (fl)')
  302.       send('Если необходимо узнать конкретную информацию по данным командам, отправьте сообщение следующего формата: "? <command>"')
  303.       sms = false
  304.     elseif string.find(sms, 'useradd') then
  305.       local _, vr = string.find(sms, 'useradd')
  306.       sms = string.sub(sms, vr+2, string.len(sms))
  307.       local userId, newUser
  308.       if string.len(sms)>0 then --проверка на ввод нового ника
  309.         newUser = string.sub(sms, 1, string.find(sms, ' ')-1)
  310.         local _, vr = string.find(sms, ' ')
  311.         if vr then --проверка на id
  312.           sms = string.sub(sms, vr+1, string.len(sms))
  313.           userId = tonumber(string.sub(sms, 1, string.len(sms)))
  314.           sms = false
  315.         else
  316.           send('Забыли ввести свой уникальный номер!')
  317.         end
  318.       else
  319.         send('Некорректный ввод! Для вывода справки по команде добавьте "?"')
  320.       end
  321.       if newUser and userId then
  322.         if checkWhitelist(newUser) and #setting.Wlist>0 then
  323.           send('Офигел? Он уже есть!')
  324.         else
  325.           if checkWhitelist(a[3], userId, true) then
  326.             setting.Wlist[#setting.Wlist+1] = newUser
  327.             setting.userId[#setting.userId+1] = math.random(1000,10000)
  328.             writeConfigFile()
  329.             send('Пользователь '..newUser..' добавлен.')
  330.             imodem.send(newUser,'Ваш уникальный ID для работы с ботом '..setting.userId[#setting.userId]..' НЕ СООБЩАЙТЕ ЕГО НИКОМУ! ЗАПИШИТЕ КУДА УГОДНО! ВОССТАНОВЛЕНИЮ НЕ ПОДЛЕЖИТ!')
  331.           else
  332.             send('Ваш ID введен некорректно')
  333.           end
  334.         end
  335.       end
  336.       sms = false
  337.     elseif string.find(sms, 'identify') then
  338.       local _, vr = string.find(sms, 'identify')
  339.       sms = string.sub(sms, vr+2, string.len(sms))
  340.       local user, ident = a[3], tonumber(sms)
  341.       if ident then
  342.         if checkWhitelist(user, ident, true) then
  343.           if not tempAcc(user) then
  344.             tempName[#tempName+1] = user
  345.             send(a[3]..', доступ разрешен до следующего рестарта бота')
  346.           else
  347.             send(a[3]..', доступ уже открыт вам!')
  348.           end
  349.         else
  350.           send('Ваш ID введен некорректно')
  351.         end
  352.       end
  353.       sms = false
  354.     end
  355.   end
  356.  
  357.   if sms and tempAcc(a[3]) then
  358.     local ch, err = runCode(sms)
  359.     if not err then err = '' end
  360.     send(tostring(ch)..' '..tostring(err))
  361.     logToFile('>> '..tostring(ch)..' '..tostring(err))
  362.   end
  363. end
  364.  
  365. setting = {}
  366. tempName = {}
  367. readConfigFile()
  368. event.listen("modem_message", message)
  369. event.timer(60*30, tim, math.huge)
Add Comment
Please, Sign In to add comment