diff --git a/Applications/Chat.lua b/Applications/Chat.lua new file mode 100644 index 00000000..4e9b30ab --- /dev/null +++ b/Applications/Chat.lua @@ -0,0 +1,251 @@ + +---------------------------------------------------------------------------------------------------------------------------------- + +local components = require("component") +local event = require("event") +local unicode = require("unicode") +local sides = require("sides") +local sha = require("SHA2") +local ecs = require("ECSAPI") +local commandBlock = components.command_block +local gpu = components.gpu +local chat = components.chat_box +local redstone = component.redstone + +local administrators = {"IT", "Pornogion"} + +local votes = { + mute = { + }, +} +local voteTime = 5 +local votesToDoSomething = 1 + +---------------------------------------------------------------------------------------------------------------------------------- + +local function execute(command) + commandBlock.setCommand(command) + commandBlock.executeCommand() +end + +local function tellraw(toPlayer, text) + execute("/tellraw " .. toPlayer .. " [\"\",{\"text\":\" Сервер\",\"color\":\"gold\"},{\"text\":\": " .. text .. "\",\"color\":\"none\"}]") +end + +local function parseEventData(eventData) + local nickname = eventData[3] + + local words = {} + + for word in string.gmatch(eventData[4], "[^%s]*") do + if word ~= " " and word ~= "" then + table.insert(words, word) + end + end + + return nickname, words +end + +local function getCount(massiv) + local count = 0 + for key in pairs(massiv) do + count = count + 1 + end + return count +end + +local function analyzeMutes() + for nameToMute in pairs(votes.mute) do + if getCount(votes.mute[nameToMute]) >= votesToDoSomething then + tellraw("@a","По решению большинства игроку " .. nameToMute .. " дан мут.") + execute("/mute " .. nameToMute) + votes.mute[nameToMute] = nil + else + tellraw("@a", "Голосование за кик игрока " .. nameToMute .. " отменяется, недостаточно голосов.") + votes.mute[nameToMute] = nil + end + end +end + +local function synonym(baseWord, ...) + local synonyms = {...} + for i = 1, #synonyms do + if baseWord == synonyms[i] then return true end + end + return false +end + +local function checkNicknameForAdminRights(nickname) + local success = false + for i = 1, #administrators do + if nickname == administrators[i] then success = true; break end + end + + if not success then + tellraw("@a[name=" .. nickname .. "]", "Только админстраторы сервера имеют доступ к данной команде.") + end + + return success +end + +---------------------------------------------------------------------------------------------------------------------------------- + +ecs.setScale(0.8) +ecs.prepareToExit() +tellraw("@a","Система поддержки чата инициализирована.") +print(" "); print(" Ожидаю команд игроков..."); print(" ") + + +while true do + local eventData = {event.pull()} + if eventData[1] == "chat_message" then + + local nickname, words = parseEventData(eventData) + print(eventData[3] .. ": " .. eventData[4]) + -- print("Команды: " .. table.concat(words, ",")) + + if words[1] == "сервер" or words[1] == "Сервер" or words[1] == "серв" or words[1] == "Серв" then + + if words[2] == "замуть" then + votes.mute[words[3]] = votes.mute[words[3]] or {} + votes.mute[words[3]][nickname] = true + event.timer(voteTime, analyzeMutes) + tellraw("@a","Начинается голосование за мут игрока " .. words[3] .. ", количество голосов: " .. getCount(votes.mute[words[3]]) .. " из " .. votesToDoSomething .. ".") + + elseif words[2] == "телепортни" or words[2] == "тпни" or words[2] == "тп" or words[2] == "телепортируй" then + + if words[3] == "на" and words[4] == "спавн" then + execute("/spawn " .. nickname) + else + tellraw("@a[name=" .. nickname .. "]", "Неизвестная локация для телепортации.") + end + + elseif words[2] == "вылечи" or words[2] == "похиль" or words[2] == "хильни" then + execute("/heal " .. nickname) + tellraw("@a[name=" .. nickname .. "]", "Держи хилку!") + + elseif (words[2] == "накорми") or (words[2] == "дай" and (words[3] == "пожрать" or words[3] == "похавать")) then + execute("/feed " .. nickname) + tellraw("@a[name=" .. nickname .. "]", "Держи хавку!") + + elseif words[2] == "дай" then + if words[3] == "ресов" then + tellraw("@a[name=" .. nickname .. "]", "Ну на.") + execute("/give @a[name=" .. nickname .. "] minecraft:dirt " .. math.random(1, 100)) + + else + tellraw("@a[name=" .. nickname .. "]", "Чего тебе дать?") + end + + elseif words[2] == "как" and words[3] == "дела" then + + local dela = { + "Лови молнию в ебло, заебал с допросами.", + "Хуево пиздец. Сейчас такую катку всрал - играл за Инвокера, вышел с мида со счетом 7 0, а в итоге всосали гейм за 20 минут.", + "Ну, более-менее. Даже несмотря на то, что какие-то пидоры все время отвлекают от мирного афк в чате.", + "Нормально. Сам как?", + "Дела заебок, сегодня вытащил матч за войда с тремя ДЦП в тиме. А у тебя как успехи?", + "Отлично! Накодил вон потный скрипт, сейчас буду тестировать. error[320] in cyka.lua: attempt to index countOfFatMothers (a nil value) Бля.", + "Старая шлюха родила! Иди на хуй со своими расспросами.", + } + + local number = math.random(1, #dela) + if number == 1 then execute("/shock " .. nickname) end + tellraw("@a", dela[number]) + + elseif words[2] == "скажи" and (words[3] == "админу" or words[3] == "админам") then + local message = {} + for i = 4, #words do + table.insert(message, words[i]) + end + for i = 1, #administrators do + tellraw("@a[name=" .. administrators[i] .. "]", "Вам отправили личное сообщение как администратору. Прочтите через /mail read.") + execute("/mail send " .. administrators[i] .. " <От " .. nickname .. "> " .. table.concat(message, " ")) + end + + elseif words[2] == "очисти" and words[3] == "чат" then + tellraw("@a[name=" .. nickname .. "]", string.rep(" ", 3000)) + tellraw("@a[name=" .. nickname .. "]", "Чат очищен.") + + elseif synonym(words[2], "вруби", "включи") and synonym(words[3], "электричество", "свет") then + if checkNicknameForAdminRights(nickname) then + tellraw("@a", "Серверное освещение включено по приказу " .. nickname) + redstone.setOutput(sides.bottom, 15) + end + + elseif synonym(words[2], "выруби", "выключи", "отключи") and synonym(words[3], "электричество", "свет") then + if checkNicknameForAdminRights(nickname) then + tellraw("@a", "Серверное освещение отключено по приказу " .. nickname) + redstone.setOutput(sides.bottom, 0) + end + + elseif synonym(words[2], "хеш", "зашифруй", "хешируй") then + if words[3] then + tellraw("@a[name=" .. nickname .. "]", "SHA2-256 HASH: " .. sha.hash(words[3])) + else + tellraw("@a[name=" .. nickname .. "]", "Что тебе захешировать?") + end + + elseif synonym(words[2], "сделай", "вруби") and synonym(words[3], "день") then + if checkNicknameForAdminRights(nickname) then + tellraw("@a", "Установлено дневное время по приказу " .. nickname) + execute("/time set 0") + end + + elseif synonym(words[2], "сделай", "вруби") and synonym(words[3], "ночь") then + if checkNicknameForAdminRights(nickname) then + tellraw("@a", "Установлено ночное время по приказу " .. nickname) + execute("/time set 18000") + end + + elseif synonym(words[2], "выруби", "отключи") and synonym(words[3], "дождь") then + if checkNicknameForAdminRights(nickname) then + tellraw("@a", "Дождь отключен по приказу " .. nickname) + execute("/minecraft:weather clear") + end + + elseif synonym(words[2], "отпизди", "ебни", "убей", "отхуесось", "уничтожь") then + if checkNicknameForAdminRights(nickname) then + if words[3] then + tellraw("@a", "Как прикажешь, мой повелитель. " .. words[3] .. " был убит во имя Высшей Цели.") + execute("/kill " .. words[3]) + else + tellraw("@a[name=" .. nickname .. "]", "Скажи только имя - и я уничтожу его.") + end + end + + elseif synonym(words[2], "шанс", "вероятность") then + if words[3] then + local strings = { + "Вероятность ", + "Вероятность примерно ", + "Приблизительно ", + "Около ", + "Вероятность почти ", + } + + tellraw("@a", strings[math.random(1, #strings)] .. math.random(0, 100) .. "%") + else + tellraw("@a[name=" .. nickname .. "]", "Не указана цель поиска вероятности.") + end + + elseif words[2] then + tellraw("@a[name=" .. nickname .. "]", "Команда '" .. (words[2]) .. "' не распознана.") + else + tellraw("@a[name=" .. nickname .. "]", "Чего надо?") + end + + end + + end +end + + + + + + + + + + diff --git a/Applications/Robot/Installer.lua b/Applications/Robot/Installer.lua index d08c7178..fc16d495 100644 --- a/Applications/Robot/Installer.lua +++ b/Applications/Robot/Installer.lua @@ -1,2 +1,8 @@ local shell = require("shell") +shell.execute("wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Robot/robotAPI.lua lib/robotAPI.lua -f") + +shell.execute("wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Robot/Diamonds.lua d.lua -f") +shell.execute("wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Robot/Laser.lua l.lua -f") +shell.execute("wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Robot/HorizontalLazer.lua hl.lua -f") +shell.execute("wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Robot/Quarry.lua q.lua -f") \ No newline at end of file diff --git a/Beta/Reactor.lua b/Beta/Reactor.lua new file mode 100644 index 00000000..3531b357 --- /dev/null +++ b/Beta/Reactor.lua @@ -0,0 +1,18 @@ +local ecs = require("ECSAPI") +local components = require("component") + + +local function getInfoAboutReactors() + local massiv = {} + for component, address in pairs(components) do + if component == "reactor_chamber" then + table.insert(massiv, components.proxy(address)) + end + end +end + +local reactors = getInfoAboutReactors() + +for i = 1, #reactors do + print(reactors[i]) +end \ No newline at end of file diff --git a/lib/SHA2.lua b/lib/SHA2.lua new file mode 100644 index 00000000..c8c7ddd1 --- /dev/null +++ b/lib/SHA2.lua @@ -0,0 +1,242 @@ +-- SHA-256 code in Lua 5.2; based on the pseudo-code from +-- Wikipedia (http://en.wikipedia.org/wiki/SHA-2) + + +local band, rrotate, bxor, rshift, bnot = + bit32.band, bit32.rrotate, bit32.bxor, bit32.rshift, bit32.bnot + +local string, setmetatable, assert = string, setmetatable, assert + +_ENV = nil + +-- Initialize table of round constants +-- (first 32 bits of the fractional parts of the cube roots of the first +-- 64 primes 2..311): +local k = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +} + + +-- transform a string of bytes in a string of hexadecimal digits +local function str2hexa (s) + local h = string.gsub(s, ".", function(c) + return string.format("%02x", string.byte(c)) + end) + return h +end + + +-- transform number 'l' in a big-endian sequence of 'n' bytes +-- (coded as a string) +local function num2s (l, n) + local s = "" + for i = 1, n do + local rem = l % 256 + s = string.char(rem) .. s + l = (l - rem) / 256 + end + return s +end + +-- transform the big-endian sequence of four bytes starting at +-- index 'i' in 's' into a number +local function s232num (s, i) + local n = 0 + for i = i, i + 3 do + n = n*256 + string.byte(s, i) + end + return n +end + + +-- append the bit '1' to the message +-- append k bits '0', where k is the minimum number >= 0 such that the +-- resulting message length (in bits) is congruent to 448 (mod 512) +-- append length of message (before pre-processing), in bits, as 64-bit +-- big-endian integer +local function preproc (msg, len) + local extra = -(len + 1 + 8) % 64 + len = num2s(8 * len, 8) -- original len in bits, coded + msg = msg .. "\128" .. string.rep("\0", extra) .. len + assert(#msg % 64 == 0) + return msg +end + + +local function initH224 (H) + -- (second 32 bits of the fractional parts of the square roots of the + -- 9th through 16th primes 23..53) + H[1] = 0xc1059ed8 + H[2] = 0x367cd507 + H[3] = 0x3070dd17 + H[4] = 0xf70e5939 + H[5] = 0xffc00b31 + H[6] = 0x68581511 + H[7] = 0x64f98fa7 + H[8] = 0xbefa4fa4 + return H +end + + +local function initH256 (H) + -- (first 32 bits of the fractional parts of the square roots of the + -- first 8 primes 2..19): + H[1] = 0x6a09e667 + H[2] = 0xbb67ae85 + H[3] = 0x3c6ef372 + H[4] = 0xa54ff53a + H[5] = 0x510e527f + H[6] = 0x9b05688c + H[7] = 0x1f83d9ab + H[8] = 0x5be0cd19 + return H +end + + +local function digestblock (msg, i, H) + + -- break chunk into sixteen 32-bit big-endian words w[1..16] + local w = {} + for j = 1, 16 do + w[j] = s232num(msg, i + (j - 1)*4) + end + + -- Extend the sixteen 32-bit words into sixty-four 32-bit words: + for j = 17, 64 do + local v = w[j - 15] + local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3)) + v = w[j - 2] + local s1 = bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10)) + w[j] = w[j - 16] + s0 + w[j - 7] + s1 + end + + -- Initialize hash value for this chunk: + local a, b, c, d, e, f, g, h = + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + + -- Main loop: + for i = 1, 64 do + local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22)) + local maj = bxor(band(a, b), band(a, c), band(b, c)) + local t2 = s0 + maj + local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25)) + local ch = bxor (band(e, f), band(bnot(e), g)) + local t1 = h + s1 + ch + k[i] + w[i] + + h = g + g = f + f = e + e = d + t1 + d = c + c = b + b = a + a = t1 + t2 + end + + -- Add (mod 2^32) this chunk's hash to result so far: + H[1] = band(H[1] + a) + H[2] = band(H[2] + b) + H[3] = band(H[3] + c) + H[4] = band(H[4] + d) + H[5] = band(H[5] + e) + H[6] = band(H[6] + f) + H[7] = band(H[7] + g) + H[8] = band(H[8] + h) + +end + + +local function finalresult224 (H) + -- Produce the final hash value (big-endian): + return + str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4).. + num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)) +end + + +local function finalresult256 (H) + -- Produce the final hash value (big-endian): + return + str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4).. + num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)..num2s(H[8], 4)) +end + + +---------------------------------------------------------------------- +local HH = {} -- to reuse + +local function hash224 (msg) + msg = preproc(msg, #msg) + local H = initH224(HH) + + -- Process the message in successive 512-bit (64 bytes) chunks: + for i = 1, #msg, 64 do + digestblock(msg, i, H) + end + + return finalresult224(H) +end + + +local function hash256 (msg) + msg = preproc(msg, #msg) + local H = initH256(HH) + + -- Process the message in successive 512-bit (64 bytes) chunks: + for i = 1, #msg, 64 do + digestblock(msg, i, H) + end + + return finalresult256(H) +end +---------------------------------------------------------------------- +-- local mt = {} + +-- local function new256 () +-- local o = {H = initH256({}), msg = "", len = 0} +-- setmetatable(o, mt) +-- return o +-- end + +-- mt.__index = mt + +-- function mt:add (m) +-- self.msg = self.msg .. m +-- self.len = self.len + #m +-- local t = 0 +-- while #self.msg - t >= 64 do +-- digestblock(self.msg, t + 1, self.H) +-- t = t + 64 +-- end +-- self.msg = self.msg:sub(t + 1, -1) +-- end + + +-- function mt:close () +-- self.msg = preproc(self.msg, self.len) +-- self:add("") +-- return finalresult256(self.H) +-- end +---------------------------------------------------------------------- + +return { + hash = hash256 + -- hash256 = hash256, + -- hash224 = hash224, + -- new256 = new256, +} \ No newline at end of file