random-stuff/computercraft/apiobotrobot.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