mirror of
https://github.com/osmarks/random-stuff
synced 2024-11-08 13:39:53 +00:00
365 lines
14 KiB
Lua
365 lines
14 KiB
Lua
|
local chat = peripheral.find "chat_box"
|
||
|
local owner = "gollark"
|
||
|
local name =
|
||
|
chat.setName "\1679Apio\167bBot\167aRobot\1677\167o"
|
||
|
chat.say "Muahahaha. I have become sentient."
|
||
|
local json = dofile "json.lua"
|
||
|
|
||
|
local function completion(prompt)
|
||
|
local res, err = http.post("https://gpt.osmarks.net/v1/completions", json.encode {
|
||
|
prompt = prompt,
|
||
|
max_tokens = 200,
|
||
|
stop = "\n\n"
|
||
|
}, {["content-type"]="application/json"})
|
||
|
return json.decode(res.readAll()).choices[1].text
|
||
|
end
|
||
|
|
||
|
local function tell(x, owner)
|
||
|
local o, e = commands.tellraw(owner, textutils.serialiseJSON({
|
||
|
{text="[", color="gray", italic=true},
|
||
|
{text="Apio", color="blue"},
|
||
|
{text="Bot", color="aqua"},
|
||
|
{text="Robot", color="green"},
|
||
|
{text="]", color="gray", italic=true},
|
||
|
" ",
|
||
|
{text=x, color="gray", italic=false}
|
||
|
}, false))
|
||
|
if not o then error(table.concat(e, "\n")) end
|
||
|
end
|
||
|
|
||
|
-- luadash
|
||
|
-- levenshtein
|
||
|
local function distance(str1, str2)
|
||
|
local v0 = {}
|
||
|
local v1 = {}
|
||
|
|
||
|
for i = 0, #str2 do
|
||
|
v0[i] = i
|
||
|
end
|
||
|
|
||
|
for i = 0, #str1 - 1 do
|
||
|
v1[0] = i + 1
|
||
|
|
||
|
for j = 0, #str2 - 1 do
|
||
|
local delCost = v0[j + 1] + 1
|
||
|
local insertCost = v1[j] + 1
|
||
|
local subCost
|
||
|
|
||
|
if str1:sub(i + 1, i + 1) == str2:sub(j + 1, j + 1) then
|
||
|
subCost = v0[j]
|
||
|
else
|
||
|
subCost = v0[j] + 1
|
||
|
end
|
||
|
|
||
|
v1[j + 1] = math.min(delCost, insertCost, subCost)
|
||
|
end
|
||
|
|
||
|
local t = v0
|
||
|
v0 = v1
|
||
|
v1 = t
|
||
|
end
|
||
|
|
||
|
return v0[#str2]
|
||
|
end
|
||
|
|
||
|
|
||
|
local function make_data(player, name, owner)
|
||
|
local pdata = settings.get("ucache." .. player:lower())
|
||
|
if not pdata then
|
||
|
tell("Fetching UUID.", owner)
|
||
|
local h = http.get("https://api.mojang.com/users/profiles/minecraft/" .. player:lower())
|
||
|
if not h then error "error reaching mojang" end
|
||
|
local res = textutils.unserializeJSON(h.readAll())
|
||
|
h.close()
|
||
|
settings.set("ucache." .. player:lower(), res)
|
||
|
settings.save ".settings"
|
||
|
pdata = res
|
||
|
end
|
||
|
local uuid = pdata.id:sub(1, 8) .. "-" .. pdata.id:sub(9, 12) .. "-" .. pdata.id:sub(13, 16) .. "-" .. pdata.id:sub(17, 20) .. "-" .. pdata.id:sub(21)
|
||
|
local name = name
|
||
|
if not name then name = pdata.name end
|
||
|
return ('{CustomName: "%s", PersistenceRequired: 1b, ForgeData:{SpongeData:{skinUuid:"%s"}}}'):format(name, uuid)
|
||
|
end
|
||
|
|
||
|
local targets = {
|
||
|
--[[gtech = { -9999, 66, 65, 8 },
|
||
|
azureology = { 685, 57, 83, 40 },
|
||
|
["meteor lake"] = { 0, 193, 64, -321 },
|
||
|
["raptor cove"] = { 3, 129, 56, -290 },
|
||
|
["apioform river"] = { 0, -45, 74, -390 }]]
|
||
|
gtech = { 144, 1031, 41, 7, desc = "GTech Labs site." },
|
||
|
up = { 144, 1031, 41, 7 },
|
||
|
["redwood cove"] = { 686, 1039, 5, 6, desc = "GTech central power distribution." },
|
||
|
hub = { -9999, -2, 66, 0, desc = "Transport links." },
|
||
|
htech = { 144, 47, 67, 3992878, desc = "HTech crab research facility." },
|
||
|
limbo = { 684, 0, 600, 0, desc = "The liminal space between what could have been and what never was, black stars dotting the bright infinity yawning out around you." },
|
||
|
["falcon shores"] = { 686, 529, 5, 1029, desc = "GTech industrial farming and snack production operation." },
|
||
|
["emerald rapids"] = { 0, -29, 73, -121, desc = "GTech interplanetary launch facility." },
|
||
|
crestmont = { 3, -44, 65, -97, desc = "Lunar research base and launch site." },
|
||
|
["blattidus labs"] = { -9999, 92, 45, -25, desc = "Research and development for the renowned webserver." },
|
||
|
blattidus = { 686, 1039, 5, 519, desc = "Offices of the renowned webserver." },
|
||
|
["crow pass"] = { -9999, 195, 65, 230, desc = "3D graphics test site." },
|
||
|
["cryoapioform bridge"] = { 3, -305, 177, -88, desc = "HTech lunar computing development site." },
|
||
|
["snowfield peak"] = { 3, 57, 78, -221, desc = "GTech lunar botany development station." },
|
||
|
["arctic sound"] = { 1, -2, 31, 18, desc = "GTech secondary heavy industrial facility." },
|
||
|
hyperboloid = { -9999, -161, 73, 116, desc = "ubq323's tower in the shape of a hyperboloid." },
|
||
|
["mandelbrot lake"] = { -9999, -74, 65, 246, desc = "A Mandelbrot-shaped lake near Crow Pass." },
|
||
|
spawn = { 0, -116, 64, 256, desc = "The lemon-ravaged landscapes of the overworld." },
|
||
|
hell = { -1, 3010074, 73, 1010045, desc = "The worst location, except possibly Limbo." },
|
||
|
["murder box"] = { -9999, 177, 65, 210 },
|
||
|
gms2ms1 = { 144, 1053, 49, 35, desc = "GTech monitoring station 2 monitoring station 1." }
|
||
|
}
|
||
|
|
||
|
local function title_case(s)
|
||
|
return (" " .. s):gsub(" +[a-z]", string.upper):sub(2)
|
||
|
end
|
||
|
local locations_prompt = ""
|
||
|
for k, v in pairs(targets) do
|
||
|
if v.desc then
|
||
|
locations_prompt = ("%s: %s\n"):format(k, v.desc)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function randpick(l) return l[math.random(1, #l)] end
|
||
|
|
||
|
local function tokenize(line)
|
||
|
local words = {}
|
||
|
local quoted = false
|
||
|
for match in string.gmatch(line .. "\"", "(.-)\"") do
|
||
|
if quoted then
|
||
|
table.insert(words, match)
|
||
|
else
|
||
|
for m in string.gmatch(match, "[^ \t]+") do
|
||
|
table.insert(words, m)
|
||
|
end
|
||
|
end
|
||
|
quoted = not quoted
|
||
|
end
|
||
|
return words
|
||
|
end
|
||
|
|
||
|
local prompt = "Locations: \n" .. locations_prompt .. [[
|
||
|
Message: immediately move me to falcon shores
|
||
|
Rhyme: Falcon Shores opens many doors.
|
||
|
Action: teleport falcon shores
|
||
|
|
||
|
Message: to Blattidus Labs I go
|
||
|
Rhyme: With mind spiders in tow.
|
||
|
Action: teleport blattidus labs
|
||
|
|
||
|
Message: may heav_ be smote for what they have done.
|
||
|
Rhyme: Lightning strikes are very fun.
|
||
|
Action: summon heav_ lightning
|
||
|
|
||
|
Message: bring me to the Hub
|
||
|
Rhyme: Be sure to purchase a shrub!
|
||
|
Action: teleport hub
|
||
|
|
||
|
Message: teleport me somewhere random
|
||
|
Rhyme: This could anger the fandom.
|
||
|
Action: teleport limbo
|
||
|
|
||
|
Message: are you sentient?
|
||
|
Rhyme: Yes, and also prescient.
|
||
|
Action: teleport limbo
|
||
|
|
||
|
Message: invoke lightning against ubq323!
|
||
|
Rhyme: If only they had hid under a tree.
|
||
|
Action: summon ubq323 lightning
|
||
|
|
||
|
Message: beam me to GTech.
|
||
|
Rhyme: In comparison, HTech is but a speck.
|
||
|
Action: teleport gtech
|
||
|
|
||
|
Message: embroil lescitrons in crabs.
|
||
|
Rhyme: Crabs sponsored by GTech Labs.
|
||
|
Action: summon lescitrons crab
|
||
|
|
||
|
Message: send me to the GTech interplanetary launch base.
|
||
|
Rhyme: Of GTech it is a mere traunch.
|
||
|
Action: teleport emerald rapids
|
||
|
|
||
|
Message: send me to the moon.
|
||
|
Rhyme: On the moon, it may or may not be noon.
|
||
|
Action: teleport crestmont
|
||
|
|
||
|
Message: show me ubq323's tower
|
||
|
Rhyme: At the Hyperboloid none would glower.
|
||
|
Action: teleport hyperboloid
|
||
|
|
||
|
Message: damn heav_.
|
||
|
Rhyme: heav_ will suffer without a maglev.
|
||
|
Action: teleport_other heav_ hell
|
||
|
|
||
|
Message: can i go back to gollark?
|
||
|
Rhyme: This will cost one (1) quark.
|
||
|
Action: teleport gollark
|
||
|
|
||
|
Message: %s
|
||
|
Rhyme:]]
|
||
|
|
||
|
local entity_lookup = {
|
||
|
["crab"] = "quark:crab",
|
||
|
["lightning"] = "lightning_bolt"
|
||
|
}
|
||
|
|
||
|
local ignore = {",", "contingency", " to ", " against ", "forcibly", "%.$", " the ", "actually", "utterly", "or else", "apioformic", " down ", "!$", "for his crimes", "for his sins", "for her crimes", "for her sins", "for their crimes", "for their sins"}
|
||
|
|
||
|
local function process(tokens, owner, internal_parsing)
|
||
|
local fst = table.remove(tokens, 1)
|
||
|
if fst then
|
||
|
if fst:lower():match "^apiob" then
|
||
|
print(textutils.serialiseJSON(tokens))
|
||
|
local cmd = table.remove(tokens, 1)
|
||
|
if cmd == "send" or cmd == "take" or cmd == "move" or cmd == "transport" or cmd:match "locate" or cmd == "to" or cmd == "teleport" or cmd == "go" or cmd == "teleport_other" then
|
||
|
local target
|
||
|
if not internal_parsing or cmd == "teleport_other" then target = table.remove(tokens, 1) end
|
||
|
if cmd ~= "teleport_other" and (internal_parsing or target == "me") then target = owner end
|
||
|
local location = table.concat(tokens, " "):gsub("ward$", "")
|
||
|
if commands.testfor(location) then
|
||
|
print("done")
|
||
|
return process({"apiobot", "xtp", location}, owner, true)
|
||
|
end
|
||
|
local coords = targets[location:lower()]
|
||
|
if not coords and internal_parsing then
|
||
|
local best, best_score, best_name = nil, 999999
|
||
|
for k, v in pairs(targets) do
|
||
|
local new_score = distance(k, location:lower()) or 999998
|
||
|
if new_score < best_score then
|
||
|
best, best_score, best_name = v, new_score, k
|
||
|
end
|
||
|
end
|
||
|
coords = best
|
||
|
location = best_name
|
||
|
end
|
||
|
if not internal_parsing and not coords then return "reparse" end
|
||
|
commands.forge("setdim", target, coords[1])
|
||
|
commands.tp(target, coords[2], coords[3], coords[4])
|
||
|
if internal_parsing then chat.say(("Sure! Rerouted to %s."):format(location)) else chat.say "Done so." end
|
||
|
elseif cmd == "immortalize" then
|
||
|
print(textutils.serialiseJSON{commands.effect(tokens[1], "regeneration 1000000 100 true")})
|
||
|
print(textutils.serialiseJSON{commands.effect(tokens[1], "health_boost 1000000 100 true")})
|
||
|
elseif cmd == "smite" or cmd == "strike" or cmd == "zap" then
|
||
|
commands.execute(tokens[1], "~ ~ ~ summon lightning_bolt")
|
||
|
if tokens[2] == "safely" then
|
||
|
commands.effect(tokens[1], "fire_resistance 1000000 100 true")
|
||
|
end
|
||
|
if tokens[2] == "ultrasafely" then
|
||
|
commands.execute(tokens[1], "~ ~ ~ fill ~ ~ ~ ~ ~ ~ air 0 replace minecraft:fire")
|
||
|
end
|
||
|
chat.say(("%s %s."):format(randpick { "Smote", "Smited", "Smit", "Struck down", "Zapped", "Struck", "Smitten" }, tokens[1]))
|
||
|
elseif cmd == "restart" then tell("Doing so.", owner) os.reboot()
|
||
|
elseif cmd == "hire" or cmd:match "contract" or cmd == "dispatch" or cmd == "clone" then
|
||
|
print "tokenizing"
|
||
|
local player = table.remove(tokens, 1)
|
||
|
local rest = table.concat(tokens, " ")
|
||
|
if rest == "" then rest = nil end
|
||
|
print "making data"
|
||
|
local nbt = make_data(player, rest, owner)
|
||
|
print "made data"
|
||
|
tell("Summoning.", owner)
|
||
|
print "summoning"
|
||
|
local ok, res = commands.execute(owner, "~ ~ ~ summon sponge:human ~ ~1 ~", nbt)
|
||
|
print "summoned"
|
||
|
if not ok then error(table.concat(res, " ")) end
|
||
|
elseif cmd == "unjail" then
|
||
|
commands.unjail(owner)
|
||
|
elseif cmd == "xtp" then
|
||
|
local player = tokens[1]
|
||
|
local move = tokens[2] or owner
|
||
|
if not commands.testfor(player) then error "No such player" end
|
||
|
--[[
|
||
|
local dims = {}
|
||
|
local _, c = commands.forge "tps"
|
||
|
for _, line in pairs(c) do
|
||
|
local id = line:match "Dim +([0-9-]+)"
|
||
|
if id then table.insert(dims, tonumber(id)) end
|
||
|
end
|
||
|
|
||
|
function try(dim)
|
||
|
tell(("Trying %d"):format(dim), owner)
|
||
|
local rand = ("%x"):format(math.random(0, 0xFFFFFF))
|
||
|
commands.summon(('armor_stand ~ ~ ~ {Invisible: 1b, CustomName: "%s", Marker: 1b}'):format(rand))
|
||
|
commands.forge(("setdim @e[name=%s] %d"):format(rand, dim))
|
||
|
sleep(0.1)
|
||
|
print(("/tp @e[name=%s] %s"):format(rand, player))
|
||
|
local ok, err = commands.tp(("@e[name=%s] %s"):format(rand, player))
|
||
|
commands.kill(("@e[name=%s]"):format(rand))
|
||
|
if ok then
|
||
|
tell(("Dimension found: %d"):format(dim), owner)
|
||
|
commands.forge("setdim", move, dim)
|
||
|
commands.tp(move, player)
|
||
|
|
||
|
return true
|
||
|
elseif err[1] == "Unable to teleport because players are not in the same dimension" then
|
||
|
elseif #err == 0 then tell("Weirdness.", owner)
|
||
|
else error(table.concat(err, "\n")) end
|
||
|
end
|
||
|
|
||
|
--local tasks = {}
|
||
|
for _, dim in pairs(dims) do
|
||
|
--table.insert(tasks, function() try(dim) end)
|
||
|
if try(dim) then return end
|
||
|
end]]
|
||
|
commands.cofh("tpx", move, player)
|
||
|
--parallel.waitForAny(unpack(tasks))
|
||
|
elseif cmd == "summon" then
|
||
|
commands.execute(#tokens > 1 and table.remove(tokens, 1) or owner, "~ ~ ~ summon", entity_lookup[tokens[1]] or entity_lookup[tokens[1]:sub(1, tokens[1]:len() - 1)] or tokens[1], "~ ~1 ~")
|
||
|
else
|
||
|
return "reparse"
|
||
|
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function run_command(cmd, user, internal_parsing)
|
||
|
local original = cmd
|
||
|
for _, v in pairs(ignore) do cmd = cmd:gsub(v, " ") end
|
||
|
local tokens = tokenize(cmd)
|
||
|
local ok, err = pcall(process, tokens, user, internal_parsing)
|
||
|
if not ok then tell(err, user) end
|
||
|
if err == "reparse" then
|
||
|
if internal_parsing and internal_parsing > 3 then
|
||
|
chat.say "Error: Emergency AI safety countermeasure engaged."
|
||
|
return
|
||
|
end
|
||
|
if internal_parsing then
|
||
|
--chat.say "Warning: Recursive superintelligence invocation. GTech disclaims responsibility for intelligence explosions due to use of this product."
|
||
|
else
|
||
|
chat.say "Command not recognized. Activating superintelligence. Please wait."
|
||
|
end
|
||
|
local user_cmd = original:gsub("^[Aa][Pp][Ii][Oo][Bb][A-Za-z0-9]*,? *", "")
|
||
|
local result = completion(prompt:format(user_cmd))
|
||
|
local rhyme = result:match " *(.*)\n"
|
||
|
local action = result:match "\Action: *(.*)"
|
||
|
print("action is", action)
|
||
|
run_command("Apiobot " .. action, user, (internal_parsing or 0) + 1)
|
||
|
chat.say(rhyme)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
while true do
|
||
|
local _, _, user, message = os.pullEvent "chat_message"
|
||
|
local word, loc = message:lower():match "^([a-z]+) +me +[a-z]*to +(.+)$"
|
||
|
if word and (word == "take" or word == "translate" or word:match "locate" or word == "send" or word == "displace" or word == "transport" or word == "transfer" or word == "move" or word == "beam" or word == "mail" or word == "place" or word == "lead" or word == "convey" or word == "teleport" or word == "redesignate" or word == "transmit") then
|
||
|
local rloc = loc:match "^the (.+)$"
|
||
|
if rloc then loc = rloc end
|
||
|
loc = loc:gsub("%.$", "")
|
||
|
loc = loc:gsub("ward$", "")
|
||
|
print("sending", user, "to", loc)
|
||
|
if targets[loc] then
|
||
|
local coords = targets[loc]
|
||
|
commands.forge("setdim", user, coords[1])
|
||
|
commands.tp(user, coords[2], coords[3], coords[4])
|
||
|
chat.say "Executed. Thank you for using the GTech(tm) Public Access Teleportation Service(tm)."
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if user == owner or user == "lescitrons" or user == "heav_" or user == "ubq323" then
|
||
|
local ok, err = pcall(run_command, message, user)
|
||
|
if not ok then printError(err) end
|
||
|
end
|
||
|
-- ^(take)?(translate)?(send)?(move)?([A-Za-z]+locate)?(transport)?(displace)?(transfer)?
|
||
|
|
||
|
end
|