A SpaceTraders Agent
1const std = @import("std");
2
3const pretty = @import("pretty").pretty;
4
5const meta = @import("meta");
6
7const st = @import("st");
8const api = st.api;
9const Client = st.http.Client;
10const m = st.models;
11
12const agent = @import("agent");
13const Config = agent.config.Config;
14
15pub const known_folders_config: @import("known-folders").KnownFolderConfig = .{
16 .xdg_on_mac = true,
17};
18
19fn juicyMain(
20 gpa: std.mem.Allocator,
21 io: std.Io,
22 config: *const Config,
23 client: *Client,
24) !void {
25 var db = try agent.data.DB.open(gpa, config.db);
26 defer db.deinit();
27
28 // var register_f = try api.agent.register(client, "ALTAGOS", .ANCIENTS);
29 // defer _ = register_f.cancel(io) catch {};
30
31 // const register = try register_f.await(io);
32 // defer register.deinit();
33
34 // std.log.info("Registered agent\n{f}", .{pretty(register.value)});
35
36 var af = try api.agent.own(client);
37 defer _ = af.cancel(io) catch {};
38
39 var fleet_f = try api.fleet.listShips(client, .{});
40 defer _ = fleet_f.cancel(io) catch {};
41
42 var traits = [_]m.systems.Waypoint.Trait{ .MARKETPLACE, .INDUSTRIAL, .OCEAN };
43 var waypoints_f = try api.system.waypoints(
44 client,
45 (try m.parseSymbol("X1-TA72")).system,
46 .{ .traits = &traits },
47 .{},
48 );
49 defer _ = waypoints_f.cancel(io) catch {};
50
51 const own = try af.await(io);
52 defer own.deinit();
53
54 const fleet = try fleet_f.await(io);
55 defer fleet.deinit();
56
57 const waypoints = try waypoints_f.await(io);
58 defer waypoints.deinit();
59
60 std.log.info("Agent: {f}", .{pretty(own.value)});
61 std.log.info("Ships: {f}", .{pretty(fleet.value.data.?)});
62 std.log.info("Waypoints with {any} traits: {f}", .{ traits, pretty(waypoints.value.data.?) });
63
64 if (waypoints.value.data.?.len > 0) {
65 var market_f = try api.system.market(
66 client,
67 waypoints.value.data.?[0].symbol.waypoint,
68 );
69 defer _ = market_f.cancel(io) catch {};
70
71 const market = try market_f.await(io);
72 defer market.deinit();
73
74 std.log.info("Market: {f}", .{pretty(market.value.data.?)});
75 }
76}
77
78pub fn main(init: std.process.Init) !void {
79 const allocator = init.gpa;
80
81 var io_impl: std.Io.Threaded = .init(allocator, .{
82 .environ = init.minimal.environ,
83 });
84 defer io_impl.deinit();
85 const io = io_impl.io();
86
87 std.log.debug("Io threads: {}", .{io_impl.concurrent_limit.toInt() orelse 0});
88
89 const config = try agent.config.load(io, allocator, init.environ_map);
90 defer agent.config.free(allocator, config);
91
92 var client = Client.init(allocator, io, .{
93 .auth = config.auth,
94 });
95 defer client.deinit();
96
97 try juicyMain(allocator, io, &config, &client);
98}