Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local event = require('event')
- _G.com = require('computer')
- _G.c = require('component')
- local function logToFile(sms) --логирование
- if true then --если логирование не надо, сменить на false
- local f = io.open('/bot/LOG.txt','a')
- f:write(sms..'\n')
- f:close()
- end
- end
- logToFile('#######БОТ#ЗАПУСК#######')
- if c.isAvailable("robot") then
- _G.r = require('robot')
- logToFile('Работаем на роботе. Библиотека робота подключена')
- end
- _G.fl = require('filesystem')
- if not fl.exists('/bot') then
- logToFile('Дирректория бота не найдена! Создаем...')
- logToFile(tostring(fl.makeDirectory('/bot')))
- end
- if fl.exists('/bot/imodem.lua') then
- logToFile('Запуск библиотеки моста')
- os.execute('/bot/imodem.lua')
- else
- print('Отсутствует библиотека imodem. Выполняю автоскачивание.')
- logToFile('Автоскачивание библиотеки моста')
- os.execute('pastebin get -f MvR7FTGS /bot/imodem.lua')
- logToFile('Запуск библиотеки моста')
- os.execute('/bot/imodem.lua')
- end
- local function curPhrase(line) --вырезка фразы с разделителем
- local t = {}
- if line and line ~= '\n' then
- repeat
- t[#t+1] = string.sub(line, 1, string.find(line, ';')-1)
- line = string.sub(line, string.find(line, ';')+1, string.len(line))
- until #line == 0
- end
- return t
- end
- local function writeConfigFile(type) --перезапись/обновление настроек
- if type then
- logToFile('@ Перезапись файлов конфигурации до базового уровня')
- f = io.open('/bot/bot.cfg', 'w')
- f:write('Bot setup file;\n')
- f:write('Whitelist;'..'\n')
- f:write('User Id;'..'\n')
- f:write('Bot call symbol;~;\n')
- f:close()
- logToFile('@ Перезапись завершена')
- else
- logToFile('@ Обновление файлов конфигурации')
- local f = io.open('/bot/bot.cfg', 'w')
- f:write('Bot setup file;\n')
- local vr = ''
- for i=1, #setting.Wlist do
- vr = vr..setting.Wlist[i]..';'
- end
- f:write('Whitelist;'..vr..'\n')
- logToFile('Запись > '..'Whitelist;'..vr)
- vr = ''
- for i=1, #setting.userId do
- vr = vr..setting.userId[i]..';'
- end
- f:write('User Id;'..tostring(vr)..'\n')
- logToFile('Запись > '..'User Id;'..vr)
- f:write('Bot call symbol;'..setting.sym..';\n')
- logToFile('Запись > '..'Bot call symbol;'..setting.sym)
- f:close()
- logToFile('@ Обновление файлов конфигурации завершено!')
- end
- end
- local function readConfigFile() --чтение настроек
- if not fl.exists('/bot/bot.cfg') then
- logToFile('Файл конфигурации не найден!')
- writeConfigFile(true)
- end
- logToFile('@ Чтение файла конфигурации')
- local f = io.open('/bot/bot.cfg', 'r')
- local line = f:read()
- logToFile(line..'| информационная')
- local vr = curPhrase(f:read())
- logToFile(#vr..'| объем ников')
- setting.Wlist = {}
- for i=2, #vr do
- logToFile('| '..vr[i])
- setting.Wlist[#setting.Wlist+1] = vr[i]
- end
- logToFile(#setting.Wlist..'| объем ников в памяти')
- vr = curPhrase(f:read())
- logToFile(#vr..'| объем паролей')
- setting.userId = {}
- for i=2, #vr do
- logToFile('| '..vr[i])
- setting.userId[#setting.userId+1] = tonumber(vr[i])
- end
- logToFile(#setting.userId..'| объем паролей в памяти')
- vr = curPhrase(f:read())
- logToFile(#vr..'| объем символов')
- setting.sym = {}
- setting.sym = tostring(vr[2])
- logToFile(setting.sym..'| тип символа')
- f:close()
- logToFile('@ Чтение файла конфигурации завершено')
- end
- local function charSearch(sms) --поиск символа с отделением кода
- if sms and string.sub(sms, 1, string.len(setting.sym)) == setting.sym then
- return string.sub(sms, string.len(setting.sym)+1, string.len(sms))
- else
- return false
- end
- end
- local function tim()
- if com.uptime() >= (60*60)*5 then
- imodem.broadcast('Перезагрузка!')
- logToFile('#######РЕСТАРТ#######')
- com.shutdown(true)
- else
- imodem.broadcast('Время работы: '..os.date("%H:%M", math.ceil(com.uptime())-1))
- logToFile('Время работы: '..os.date("%H:%M", math.ceil(com.uptime())-1))
- end
- end
- local function runCode(code)
- local chunk, err = load(code)
- if not chunk then
- return false, err -- load вернул ошибку
- end
- local success, returnValue = pcall(chunk)
- if not success then
- return false, returnValue -- pcall поймал ошибку
- end
- return true, returnValue -- всё хорошо, ошибок нет
- end
- local function checkWhitelist(name, id, type) --проверка по нику. Если нету в вайтлисте то фиг сработает
- if #setting.Wlist == 0 then --данные на вход(имя, пароль, проверить пароль?)
- return true
- end
- for i=1, #setting.Wlist do
- if setting.Wlist[i] == name then
- if not type then --проверка по нику по id не проверяет
- return true, i
- else
- if setting.userId[i] == id then --проверка по id и нику
- return true
- end
- end
- end
- end
- return false
- end
- local function tempAcc(name) --Временный доступ
- if #setting.Wlist == 0 then
- return true
- end
- for i=1,#tempName do
- if tempName[i] == name then
- return true
- end
- end
- return false
- end
- local a={}
- local function send(data) --умная пересылка. Откуда получит запрос, туда и отправит
- if a[5] == imodem.channel then
- imodem.broadcast(data)
- else
- imodem.send(a[3], data)
- end
- end
- local function helpCommand(sms)
- sms = string.sub(sms, 3, string.len(sms))
- print(sms)
- if sms == 'exit' then
- send('Выход из программы. Система продолжит свою работу. Мост будет недоступен')
- elseif sms == 'update' then
- send('Выполняет обновление программы бота')
- elseif sms == 'time' then
- send('Возвращает время работы бота')
- elseif sms == 'reboot' then
- send('Перезагрузка бота с аварийным выходом из программы')
- elseif sms == 'useradd' then
- send('Добавить нового пользователя. Формат записи [useradd <новый пользователь> <ваш ID>]. Соблюдайте конфиденциальность и присылайте данное сообщение в личку! Регистрируемый пользователь должен быть в сети!')
- elseif sms == 'userdel' then
- send('Удалить указанного пользователя из доступа к боту. Формат записи [userdel <уничтожаемый пользователь> <ваш ID>]. Соблюдайте конфиденциальность и присылайте данное сообщение в личку!')
- elseif sms == 'help' then
- send('Основная информация по боту')
- elseif sms == 'users' then
- send('Вывод информации по всем зарегистрированным пользователям')
- elseif sms == 'identify' then
- send('Авторизация в боте, чтобы подтвердить что у вас не украли ваш ник. Для авторизации введите "/msg <Name_bot> identify <password>"')
- else
- send('Команда не опознана. Для вывода общей справки введите "'..setting.sym..'help". Для вывода справки по функции введите "? <command>"')
- end
- end
- function message(...)
- a = {...} --3 ник 5 тип приема 6 сообщение
- local sms = charSearch(a[6])
- if sms then
- if checkWhitelist(a[3]) then
- --print('> '..sms) --закомментировать для скрытной работы
- else
- sms = false
- end
- end
- logToFile(a[3]..' << '..sms)
- if string.sub(sms, 1, 1) == '?' then
- helpCommand(sms)
- sms = false
- end
- if sms and tempAcc(a[3]) then --команды для авторизованных
- if sms == 'exit' then
- send('IRC мост остановлен! Для восстановления связи перезагрузите вручную бота.')
- imodem.stop()
- os.exit()
- elseif sms == 'update' then
- send('Выполняю скачивание последнего обновления бота ...')
- if not fl.exists('/bot') then
- fl.makeDirectory('/bot')
- end
- os.execute('pastebin get -f Wm7H7Nb4 /bot/bot.lua')
- os.execute('pastebin get -f MvR7FTGS /bot/imodem.lua')
- send('Обновление загружено, перезагрузка.')
- com.shutdown(true)
- elseif sms == 'reboot' then
- send('Аварийная перезагрузка!')
- imodem.stop()
- com.shutdown(true)
- elseif string.find(sms, 'userdel') then
- local _, vr = string.find(sms, 'userdel')
- sms = string.sub(sms, vr+2, string.len(sms))
- local userId, oldUser
- if string.len(sms)>0 then --проверка на ввод нового ника
- oldUser = string.sub(sms, 1, string.find(sms, ' ')-1)
- local _, vr = string.find(sms, ' ')
- if vr then --проверка на id
- sms = string.sub(sms, vr+1, string.len(sms))
- userId = tonumber(string.sub(sms, 1, string.len(sms)))
- sms = false
- else
- send('Забыли ввести свой уникальный номер!')
- end
- else
- send('Некорректный ввод! Для вывода справки по команде перед командой добавьте "?"')
- end
- if oldUser and userId then
- if checkWhitelist(oldUser) then
- if checkWhitelist(a[3], userId, true) then
- local _, num = checkWhitelist(oldUser)
- table.remove(setting.Wlist, num)
- table.remove(setting.userId, num)
- writeConfigFile()
- send('Пользователь '..oldUser..' испепелен!')
- imodem.send(oldUser,'К сожалению вы потеряли доступ к боту. Прощайте...')
- else
- send('Ваш ID введен некорректно')
- end
- else
- send('А зачем ты удаляешь того, кого и так доступа то нет?')
- end
- end
- sms = false
- end
- end
- if sms then
- if sms == 'time' then
- tim()
- sms = false
- elseif sms == 'users' then
- local vr = ''
- for i=1, #setting.Wlist do
- vr = vr..setting.Wlist[i]..' '
- end
- if vr == '' then
- send('Доступ разрешен всем!')
- else
- send('Список пользователей, которым разрешен доступ:')
- send(vr)
- end
- sms = false
- elseif sms == 'help' then
- send('Я бот который находится в Minecraft. Можете мною управлять при помощи командной строки. Я понимаю все команды которые начинаются со знака '..setting.sym..'')
- send('Для авторизации введите "/msg <Name_bot> identify <password>"')
- send('Доступные команды без авторизации: help, time, useradd, users')
- send('После авторизации вам будут доступно управление ботом и команды: identify userdel, update, exit, reboot, identify')
- send('Глобальные компоненты: computer = (com), component = (c), robot = (r), filesystem = (fl)')
- send('Если необходимо узнать конкретную информацию по данным командам, отправьте сообщение следующего формата: "? <command>"')
- sms = false
- elseif string.find(sms, 'useradd') then
- local _, vr = string.find(sms, 'useradd')
- sms = string.sub(sms, vr+2, string.len(sms))
- local userId, newUser
- if string.len(sms)>0 then --проверка на ввод нового ника
- newUser = string.sub(sms, 1, string.find(sms, ' ')-1)
- local _, vr = string.find(sms, ' ')
- if vr then --проверка на id
- sms = string.sub(sms, vr+1, string.len(sms))
- userId = tonumber(string.sub(sms, 1, string.len(sms)))
- sms = false
- else
- send('Забыли ввести свой уникальный номер!')
- end
- else
- send('Некорректный ввод! Для вывода справки по команде добавьте "?"')
- end
- if newUser and userId then
- if checkWhitelist(newUser) and #setting.Wlist>0 then
- send('Офигел? Он уже есть!')
- else
- if checkWhitelist(a[3], userId, true) then
- setting.Wlist[#setting.Wlist+1] = newUser
- setting.userId[#setting.userId+1] = math.random(1000,10000)
- writeConfigFile()
- send('Пользователь '..newUser..' добавлен.')
- imodem.send(newUser,'Ваш уникальный ID для работы с ботом '..setting.userId[#setting.userId]..' НЕ СООБЩАЙТЕ ЕГО НИКОМУ! ЗАПИШИТЕ КУДА УГОДНО! ВОССТАНОВЛЕНИЮ НЕ ПОДЛЕЖИТ!')
- else
- send('Ваш ID введен некорректно')
- end
- end
- end
- sms = false
- elseif string.find(sms, 'identify') then
- local _, vr = string.find(sms, 'identify')
- sms = string.sub(sms, vr+2, string.len(sms))
- local user, ident = a[3], tonumber(sms)
- if ident then
- if checkWhitelist(user, ident, true) then
- if not tempAcc(user) then
- tempName[#tempName+1] = user
- send(a[3]..', доступ разрешен до следующего рестарта бота')
- else
- send(a[3]..', доступ уже открыт вам!')
- end
- else
- send('Ваш ID введен некорректно')
- end
- end
- sms = false
- end
- end
- if sms and tempAcc(a[3]) then
- local ch, err = runCode(sms)
- if not err then err = '' end
- send(tostring(ch)..' '..tostring(err))
- logToFile('>> '..tostring(ch)..' '..tostring(err))
- end
- end
- setting = {}
- tempName = {}
- readConfigFile()
- event.listen("modem_message", message)
- event.timer(60*30, tim, math.huge)
Add Comment
Please, Sign In to add comment