A SpaceTraders Agent

implement all models required to register a new agent

altagos.dev 7cd4bfb6 d1ae091c

verified
+462 -8
+2
build.zig
··· 29 29 .{ .name = "known-folders", .module = known_folders }, 30 30 // Modules 31 31 .{ .name = "st", .module = st }, 32 + .{ .name = "meta", .module = meta }, 32 33 }, 33 34 }); 34 35 ··· 37 38 .target = target, 38 39 .optimize = optimize, 39 40 .imports = &.{ 41 + .{ .name = "pretty", .module = pretty }, 40 42 .{ .name = "known-folders", .module = known_folders }, 41 43 // Modules 42 44 .{ .name = "st", .module = st },
+17
src/st/models.zig
··· 1 + const std = @import("std"); 2 + 1 3 pub const accounts = @import("models/accounts.zig"); 2 4 pub const agents = @import("models/agents.zig"); 5 + pub const contracts = @import("models/contracts.zig"); 3 6 pub const factions = @import("models/factions.zig"); 7 + pub const ships = @import("models/ships.zig"); 8 + 9 + pub const inventory = @import("models/inventory.zig"); 4 10 5 11 pub const Info = @import("models/Info.zig"); 6 12 ··· 23 29 /// How many entries to return per page 24 30 /// min: 1, max: 20 25 31 limit: u64 = 20, 32 + 33 + pub fn format(this: @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { 34 + try writer.print("?page={}&limit={}", .{ this.page, this.limit }); 35 + } 26 36 }; 27 37 28 38 pub const Error = struct { ··· 43 53 expectedSubject: ?[]const u8 = null, 44 54 receivedSubject: ?[]const u8 = null, 45 55 }; 56 + }; 57 + 58 + pub const Cooldown = struct { 59 + shipSymbol: []const u8, 60 + totalSeconds: u64, 61 + remainingSeconds: u64, 62 + expiration: ?[]const u8 = null, 46 63 }; 47 64 48 65 /// List of Possible Error Codes
+30 -8
src/st/models/agents.zig
··· 3 3 const Response = st.http.Response; 4 4 const Wrapper = st.models.Wrapper; 5 5 const Query = st.models.Query; 6 + 7 + const Contract = st.models.contracts.Contract; 8 + const Faction = st.models.factions.Faction; 6 9 const FactionSymbol = st.models.factions.Symbol; 10 + const Ship = st.models.ships.Ship; 7 11 8 12 pub const Agent = struct { 9 13 symbol: []const u8, ··· 13 17 shipCount: u64, 14 18 }; 15 19 20 + pub const Register = struct { 21 + token: []const u8, 22 + agent: Agent, 23 + faction: Faction, 24 + contract: Contract, 25 + ships: []Ship, 26 + }; 27 + 16 28 pub fn list(client: *Client, opts: Query) !Response([]Agent) { 17 - return client.request( 29 + return client.get( 18 30 Wrapper([]Agent), 19 - "/agents?page={}&limit={}", 20 - .{ opts.page, opts.limit }, 21 - .{ .auth = .agent }, 31 + "/agents{f}", 32 + .{opts}, 33 + .agent, 22 34 ); 23 35 } 24 36 25 37 pub fn get(client: *Client, symbol: []const u8) !Response(Agent) { 26 - return client.request( 38 + return client.get( 27 39 Wrapper(Agent), 28 40 "/agents/{s}", 29 41 .{symbol}, 30 - .{ .auth = .agent }, 42 + .agent, 31 43 ); 32 44 } 33 45 34 46 pub fn own(client: *Client) !Response(Agent) { 35 - return client.request( 47 + return client.get( 36 48 Wrapper(Agent), 37 49 "/my/agent", 38 50 .{}, 39 - .{ .auth = .agent }, 51 + .agent, 52 + ); 53 + } 54 + 55 + pub fn register(client: *Client, symbol: []const u8, faction: FactionSymbol, email: ?[]const u8) !Response(Register) { 56 + return client.post( 57 + Wrapper(Register), 58 + "/register", 59 + .{}, 60 + .{ .symbol = symbol, .faction = faction, .email = email }, 61 + .account, 40 62 ); 41 63 }
+33
src/st/models/contracts.zig
··· 1 + pub const Contract = struct { 2 + id: u64, 3 + factionSymbol: []const u8, 4 + type: Type, 5 + terms: Terms, 6 + accepted: bool, 7 + fullfilled: bool, 8 + deadlineToAccept: []const u8, 9 + }; 10 + 11 + pub const Type = enum { 12 + PROCUREMENT, 13 + TRANSPORT, 14 + SHUTTLE, 15 + }; 16 + 17 + pub const Terms = struct { 18 + deadline: []const u8, 19 + payment: Payment, 20 + deliver: []Deliver, 21 + }; 22 + 23 + pub const Payment = struct { 24 + onAccepted: u64, 25 + onFulfilled: u64, 26 + }; 27 + 28 + pub const Deliver = struct { 29 + tradeSymbol: []const u8, 30 + destinationSymbol: []const u8, 31 + unitsRequired: u64, 32 + unitsFulfilled: u64, 33 + };
+201
src/st/models/inventory.zig
··· 1 + const CombinedEnum = @import("meta").CombinedEnum; 2 + 3 + pub const Cargo = struct { 4 + capacity: u64, 5 + units: u64, 6 + inventory: []Item, 7 + }; 8 + 9 + pub const ItemSymbol = struct { 10 + pub const All = CombinedEnum(ItemSymbol); 11 + 12 + pub const Other = enum { 13 + // PRECIOUS_STONES, 14 + // QUARTZ_SAND, 15 + // SILICON_CRYSTALS, 16 + // AMMONIA_ICE, 17 + LIQUID_HYDROGEN, 18 + LIQUID_NITROGEN, 19 + // ICE_WATER, 20 + EXOTIC_MATTER, 21 + ADVANCED_CIRCUITRY, 22 + GRAVITON_EMITTERS, 23 + IRON, 24 + // IRON_ORE, 25 + COPPER, 26 + // COPPER_ORE, 27 + ALUMINUM, 28 + // ALUMINUM_ORE, 29 + SILVER, 30 + // SILVER_ORE, 31 + GOLD, 32 + // GOLD_ORE, 33 + PLATINUM, 34 + // PLATINUM_ORE, 35 + DIAMONDS, 36 + URANITE, 37 + // URANITE_ORE, 38 + MERITIUM, 39 + // MERITIUM_ORE, 40 + HYDROCARBON, 41 + ANTIMATTER, 42 + FAB_MATS, 43 + FERTILIZERS, 44 + FABRICS, 45 + FOOD, 46 + JEWELRY, 47 + MACHINERY, 48 + FIREARMS, 49 + ASSAULT_RIFLES, 50 + MILITARY_EQUIPMENT, 51 + EXPLOSIVES, 52 + LAB_INSTRUMENTS, 53 + AMMUNITION, 54 + ELECTRONICS, 55 + SHIP_PLATING, 56 + SHIP_PARTS, 57 + EQUIPMENT, 58 + FUEL, 59 + MEDICINE, 60 + DRUGS, 61 + CLOTHING, 62 + MICROPROCESSORS, 63 + PLASTICS, 64 + POLYNUCLEOTIDES, 65 + BIOCOMPOSITES, 66 + QUANTUM_STABILIZERS, 67 + NANOBOTS, 68 + AI_MAINFRAMES, 69 + QUANTUM_DRIVES, 70 + ROBOTIC_DRONES, 71 + CYBER_IMPLANTS, 72 + GENE_THERAPEUTICS, 73 + NEURAL_CHIPS, 74 + MOOD_REGULATORS, 75 + VIRAL_AGENTS, 76 + MICRO_FUSION_GENERATORS, 77 + SUPERGRAINS, 78 + LASER_RIFLES, 79 + HOLOGRAPHICS, 80 + SHIP_SALVAGE, 81 + RELIC_TECH, 82 + NOVEL_LIFEFORMS, 83 + BOTANICAL_SPECIMENS, 84 + CULTURAL_ARTIFACTS, 85 + }; 86 + 87 + pub const Deposit = enum { 88 + QUARTZ_SAND, 89 + SILICON_CRYSTALS, 90 + PRECIOUS_STONES, 91 + ICE_WATER, 92 + AMMONIA_ICE, 93 + IRON_ORE, 94 + COPPER_ORE, 95 + SILVER_ORE, 96 + ALUMINUM_ORE, 97 + GOLD_ORE, 98 + PLATINUM_ORE, 99 + DIAMONDS, 100 + URANITE_ORE, 101 + MERITIUM_ORE, 102 + }; 103 + 104 + pub const Engine = enum { 105 + ENGINE_IMPULSE_DRIVE_I, 106 + ENGINE_ION_DRIVE_I, 107 + ENGINE_ION_DRIVE_II, 108 + ENGINE_HYPER_DRIVE_I, 109 + }; 110 + 111 + pub const Frame = enum { 112 + FRAME_PROBE, 113 + FRAME_DRONE, 114 + FRAME_INTERCEPTOR, 115 + FRAME_RACER, 116 + FRAME_FIGHTER, 117 + FRAME_FRIGATE, 118 + FRAME_SHUTTLE, 119 + FRAME_EXPLORER, 120 + FRAME_MINER, 121 + FRAME_LIGHT_FREIGHTER, 122 + FRAME_HEAVY_FREIGHTER, 123 + FRAME_TRANSPORT, 124 + FRAME_DESTROYER, 125 + FRAME_CRUISER, 126 + FRAME_CARRIER, 127 + FRAME_BULK_FREIGHTER, 128 + }; 129 + 130 + pub const Module = enum { 131 + MODULE_MINERAL_PROCESSOR_I, 132 + MODULE_GAS_PROCESSOR_I, 133 + MODULE_CARGO_HOLD_I, 134 + MODULE_CARGO_HOLD_II, 135 + MODULE_CARGO_HOLD_III, 136 + MODULE_CREW_QUARTERS_I, 137 + MODULE_ENVOY_QUARTERS_I, 138 + MODULE_PASSENGER_CABIN_I, 139 + MODULE_MICRO_REFINERY_I, 140 + MODULE_ORE_REFINERY_I, 141 + MODULE_FUEL_REFINERY_I, 142 + MODULE_SCIENCE_LAB_I, 143 + MODULE_JUMP_DRIVE_I, 144 + MODULE_JUMP_DRIVE_II, 145 + MODULE_JUMP_DRIVE_III, 146 + MODULE_WARP_DRIVE_I, 147 + MODULE_WARP_DRIVE_II, 148 + MODULE_WARP_DRIVE_III, 149 + MODULE_SHIELD_GENERATOR_I, 150 + MODULE_SHIELD_GENERATOR_II, 151 + }; 152 + 153 + pub const Mount = enum { 154 + MOUNT_GAS_SIPHON_I, 155 + MOUNT_GAS_SIPHON_II, 156 + MOUNT_GAS_SIPHON_III, 157 + MOUNT_SURVEYOR_I, 158 + MOUNT_SURVEYOR_II, 159 + MOUNT_SURVEYOR_III, 160 + MOUNT_SENSOR_ARRAY_I, 161 + MOUNT_SENSOR_ARRAY_II, 162 + MOUNT_SENSOR_ARRAY_III, 163 + MOUNT_MINING_LASER_I, 164 + MOUNT_MINING_LASER_II, 165 + MOUNT_MINING_LASER_III, 166 + MOUNT_LASER_CANNON_I, 167 + MOUNT_MISSILE_LAUNCHER_I, 168 + MOUNT_TURRET_I, 169 + }; 170 + 171 + pub const Reactor = enum { 172 + REACTOR_SOLAR_I, 173 + REACTOR_FUSION_I, 174 + REACTOR_FISSION_I, 175 + REACTOR_CHEMICAL_I, 176 + REACTOR_ANTIMATTER_I, 177 + }; 178 + 179 + pub const Ship = enum { 180 + SHIP_PROBE, 181 + SHIP_MINING_DRONE, 182 + SHIP_SIPHON_DRONE, 183 + SHIP_INTERCEPTOR, 184 + SHIP_LIGHT_HAULER, 185 + SHIP_COMMAND_FRIGATE, 186 + SHIP_EXPLORER, 187 + SHIP_HEAVY_FREIGHTER, 188 + SHIP_LIGHT_SHUTTLE, 189 + SHIP_ORE_HOUND, 190 + SHIP_REFINING_FREIGHTER, 191 + SHIP_SURVEYOR, 192 + SHIP_BULK_FREIGHTER, 193 + }; 194 + }; 195 + 196 + pub const Item = struct { 197 + symbol: ItemSymbol, 198 + name: []const u8, 199 + description: []const u8, 200 + units: u64, 201 + };
+179
src/st/models/ships.zig
··· 1 + const m = @import("../models.zig"); 2 + const Cooldown = m.Cooldown; 3 + 4 + pub const Ship = struct { 5 + symbol: []const u8, 6 + registration: Registration, 7 + nav: Nav, 8 + crew: Crew, 9 + frame: Frame, 10 + reactor: Reactor, 11 + engine: Engine, 12 + modules: []Module, 13 + mounts: []Mount, 14 + cargo: m.inventory.Cargo, 15 + fuel: Fuel, 16 + cooldown: Cooldown, 17 + }; 18 + 19 + pub const Registration = struct { 20 + name: []const u8, 21 + factionSymbol: m.factions.Symbol, 22 + role: Role, 23 + }; 24 + 25 + pub const Role = enum { 26 + FABRICATOR, 27 + HARVESTER, 28 + HAULER, 29 + INTERCEPTOR, 30 + EXCAVATOR, 31 + TRANSPORT, 32 + REPAIR, 33 + SURVEYOR, 34 + COMMAND, 35 + CARRIER, 36 + PATROL, 37 + SATELLITE, 38 + EXPLORER, 39 + REFINERY, 40 + }; 41 + 42 + pub const Nav = struct { 43 + systemSymbol: []const u8, 44 + waypointSymbol: []const u8, 45 + route: Route, 46 + status: Status, 47 + flightMode: FlightMode, 48 + 49 + pub const Route = struct { 50 + destination: Waypoint, 51 + origin: Waypoint, 52 + departureTime: []const u8, 53 + arrival: []const u8, 54 + 55 + pub const Waypoint = struct { 56 + symbol: []const u8, 57 + type: Type, 58 + systemSymbol: []const u8, 59 + x: i64, 60 + y: i64, 61 + 62 + pub const Type = enum { 63 + PLANET, 64 + GAS_GIANT, 65 + MOON, 66 + ORBITAL_STATION, 67 + JUMP_GATE, 68 + ASTEROID_FIELD, 69 + ASTEROID, 70 + ENGINEERED_ASTEROID, 71 + ASTEROID_BASE, 72 + NEBULA, 73 + DEBRIS_FIELD, 74 + GRAVITY_WELL, 75 + ARTIFICIAL_GRAVITY_WELL, 76 + FUEL_STATION, 77 + }; 78 + }; 79 + }; 80 + 81 + pub const Status = enum { 82 + IN_TRANSIT, 83 + IN_ORBIT, 84 + DOCKED, 85 + }; 86 + 87 + pub const FlightMode = enum { 88 + DRIFT, 89 + STEALTH, 90 + CRUISE, 91 + BURN, 92 + }; 93 + }; 94 + 95 + pub const Crew = struct { 96 + capacity: u64, 97 + current: u64, 98 + morale: u8, 99 + required: u64, 100 + rotation: Rotation, 101 + wages: u64, 102 + 103 + pub const Rotation = enum { STRICT, RELAXED }; 104 + }; 105 + 106 + pub const Frame = struct { 107 + symbol: m.inventory.ItemSymbol.Frame, 108 + name: []const u8, 109 + description: []const u8, 110 + 111 + condition: f32, 112 + integrity: f32, 113 + moduleSlots: u64, 114 + mountingPoints: u64, 115 + fuelCapacity: u64, 116 + requirements: Requirements, 117 + quality: u64, 118 + }; 119 + 120 + pub const Reactor = struct { 121 + symbol: m.inventory.ItemSymbol.Reactor, 122 + name: []const u8, 123 + description: []const u8, 124 + 125 + condition: f32, 126 + integrity: f32, 127 + powerOutput: u64, 128 + requirements: Requirements, 129 + quality: u64, 130 + }; 131 + 132 + pub const Engine = struct { 133 + symbol: m.inventory.ItemSymbol.Engine, 134 + name: []const u8, 135 + description: []const u8, 136 + 137 + condition: f32, 138 + integrity: f32, 139 + speed: u64, 140 + requirements: Requirements, 141 + quality: u64, 142 + }; 143 + 144 + pub const Module = struct { 145 + symbol: m.inventory.ItemSymbol.Module, 146 + name: []const u8, 147 + description: []const u8, 148 + 149 + capacity: u64 = 0, 150 + range: u64 = 0, 151 + requirements: Requirements, 152 + }; 153 + 154 + pub const Mount = struct { 155 + symbol: m.inventory.ItemSymbol.Mount, 156 + name: []const u8, 157 + description: []const u8, 158 + 159 + strength: u64 = 0, 160 + deposits: []m.inventory.ItemSymbol.Deposit = &.{}, 161 + requirements: Requirements, 162 + }; 163 + 164 + pub const Fuel = struct { 165 + current: u64, 166 + capacity: u64, 167 + consumed: ?Consumed = null, 168 + 169 + pub const Consumed = struct { 170 + amount: u64, 171 + timestamp: []const u8, 172 + }; 173 + }; 174 + 175 + pub const Requirements = struct { 176 + power: ?u64 = null, 177 + crew: ?u64 = null, 178 + slots: ?u64 = null, 179 + };