1#![feature(nonpoison_mutex, sync_nonpoison)]
5#![expect(clippy::missing_safety_doc)]
6
7mod client;
8mod json;
9mod macros;
10mod queue;
11mod request;
12mod response;
13mod status;
14
15use client::CLIENT;
16use futures::future::BoxFuture;
17use json::{deserialize_ptr, serialize};
18use nil_core::event::Event;
19use std::ffi::{CString, c_char};
20use std::ptr;
21use std::sync::LazyLock;
22use tokio::runtime::{Builder as RuntimeBuilder, Runtime};
23
24pub use client::UpdateClient;
25pub use request::RequestId;
26pub use response::{Response, Result};
27pub use status::Status;
28
29static RUNTIME: LazyLock<Runtime> = LazyLock::new(|| {
30 RuntimeBuilder::new_multi_thread()
31 .enable_all()
32 .thread_name("libnil-worker")
33 .build()
34 .expect("failed to initialize tokio runtime")
35});
36
37#[unsafe(no_mangle)]
42pub unsafe extern "C" fn nil_ffi_free_str(ptr: *mut c_char) {
43 if !ptr.is_null() {
44 drop(unsafe { CString::from_raw(ptr) });
45 }
46}
47
48#[unsafe(no_mangle)]
49pub unsafe extern "C" fn nil_ffi_poll(out: *mut *mut c_char) -> Status {
50 if out.is_null() {
51 return Status::ERR_NULL_POINTER;
52 }
53
54 unsafe { *out = ptr::null_mut() };
55
56 match queue::poll() {
57 Some(entry) => {
58 match serialize(&entry) {
59 Ok(json) => {
60 let json = CString::new(json).unwrap();
61 unsafe { *out = json.into_raw() };
62 Status::OK
63 }
64 Err(_) => Status::ERR_SERIALIZATION,
65 }
66 }
67 None => Status::ERR_NOTHING_TO_POLL,
68 }
69}
70
71#[unsafe(no_mangle)]
72pub unsafe extern "C" fn nil_ffi_shutdown() {
73 queue::clear();
74}
75
76#[unsafe(no_mangle)]
77pub unsafe extern "C" fn nil_ffi_version(request_id: RequestId) {
78 push_ok!(request_id, env!("CARGO_PKG_VERSION"))
79}
80
81#[unsafe(no_mangle)]
86pub unsafe extern "C" fn nil_client_version(request_id: RequestId) {
87 push_ok!(request_id, nil_client::VERSION)
88}
89
90#[unsafe(no_mangle)]
91pub unsafe extern "C" fn nil_is_local(request_id: RequestId) {
92 async_push_ok!(request_id, CLIENT.read().await.is_local())
93}
94
95#[unsafe(no_mangle)]
96pub unsafe extern "C" fn nil_is_ready(request_id: RequestId) {
97 async_push_ok!(request_id, CLIENT.read().await.is_ready().await)
98}
99
100#[unsafe(no_mangle)]
101pub unsafe extern "C" fn nil_is_remote(request_id: RequestId) {
102 async_push_ok!(request_id, CLIENT.read().await.is_remote())
103}
104
105#[unsafe(no_mangle)]
106pub unsafe extern "C" fn nil_server_addr(request_id: RequestId) {
107 async_push_ok!(request_id, CLIENT.read().await.server_addr())
108}
109
110#[unsafe(no_mangle)]
111pub unsafe extern "C" fn nil_set_user_agent(request_id: RequestId, user_agent: *const c_char) {
112 if user_agent.is_null() {
113 queue::push_err(request_id, Status::ERR_NULL_POINTER);
114 } else {
115 match unsafe { deserialize_ptr::<String>(user_agent) } {
116 Ok(user_agent) => {
117 RUNTIME.spawn(async move {
118 CLIENT
119 .write()
120 .await
121 .set_user_agent(&user_agent);
122
123 queue::push_ok(request_id, ());
124 });
125 }
126 Err(err) => {
127 queue::push_err(request_id, err);
128 }
129 }
130 }
131}
132
133#[unsafe(no_mangle)]
134pub unsafe extern "C" fn nil_stop_client(request_id: RequestId) {
135 RUNTIME.spawn(async move {
136 CLIENT.write().await.stop().await;
137 queue::push_ok(request_id, ());
138 });
139}
140
141#[unsafe(no_mangle)]
142pub unsafe extern "C" fn nil_update_client(request_id: RequestId, options: *const c_char) {
143 if options.is_null() {
144 queue::push_err(request_id, Status::ERR_NULL_POINTER);
145 } else {
146 type OnEvent = fn(Event) -> BoxFuture<'static, ()>;
147 match unsafe { deserialize_ptr::<UpdateClient>(options) } {
148 Ok(options) => {
149 RUNTIME.spawn(async move {
150 let result = CLIENT
151 .write()
152 .await
153 .update::<OnEvent>(options.server)
154 .maybe_world_id(options.world_id)
155 .maybe_world_password(options.world_password)
156 .maybe_player_id(options.player_id)
157 .maybe_player_password(options.player_password)
158 .maybe_authorization_token(options.authorization_token)
159 .call()
160 .await;
161
162 queue::push_result(request_id, Result::from(result));
163 });
164 }
165 Err(err) => {
166 queue::push_err(request_id, err);
167 }
168 }
169 }
170}
171
172#[unsafe(no_mangle)]
173pub unsafe extern "C" fn nil_user_agent(request_id: RequestId) {
174 async_push_ok!(request_id, CLIENT.read().await.user_agent().to_owned())
175}
176
177#[unsafe(no_mangle)]
178pub unsafe extern "C" fn nil_world(request_id: RequestId) {
179 RUNTIME.spawn(async move {
180 match CLIENT.read().await.world() {
181 Some(world) => queue::push_ok(request_id, world),
182 None => queue::push_ok(request_id, None::<&str>),
183 }
184 });
185}
186
187#[unsafe(no_mangle)]
192pub unsafe extern "C" fn nil_add_academy_recruit_order(request_id: RequestId, req: *const c_char) {
193 send!(request_id, add_academy_recruit_order, req)
194}
195
196#[unsafe(no_mangle)]
197pub unsafe extern "C" fn nil_add_prefecture_build_order(request_id: RequestId, req: *const c_char) {
198 send!(request_id, add_prefecture_build_order, req)
199}
200
201#[unsafe(no_mangle)]
202pub unsafe extern "C" fn nil_add_stable_recruit_order(request_id: RequestId, req: *const c_char) {
203 send!(request_id, add_stable_recruit_order, req)
204}
205
206#[unsafe(no_mangle)]
207pub unsafe extern "C" fn nil_add_workshop_recruit_order(request_id: RequestId, req: *const c_char) {
208 send!(request_id, add_workshop_recruit_order, req)
209}
210
211#[unsafe(no_mangle)]
212pub unsafe extern "C" fn nil_authorize(request_id: RequestId, req: *const c_char) {
213 send!(request_id, authorize, req)
214}
215
216#[unsafe(no_mangle)]
217pub unsafe extern "C" fn nil_cancel_academy_recruit_order(
218 request_id: RequestId,
219 req: *const c_char,
220) {
221 send!(request_id, cancel_academy_recruit_order, req)
222}
223
224#[unsafe(no_mangle)]
225pub unsafe extern "C" fn nil_cancel_maneuver(request_id: RequestId, req: *const c_char) {
226 send!(request_id, cancel_maneuver, req)
227}
228
229#[unsafe(no_mangle)]
230pub unsafe extern "C" fn nil_cancel_prefecture_build_order(
231 request_id: RequestId,
232 req: *const c_char,
233) {
234 send!(request_id, cancel_prefecture_build_order, req)
235}
236
237#[unsafe(no_mangle)]
238pub unsafe extern "C" fn nil_cancel_stable_recruit_order(
239 request_id: RequestId,
240 req: *const c_char,
241) {
242 send!(request_id, cancel_stable_recruit_order, req)
243}
244
245#[unsafe(no_mangle)]
246pub unsafe extern "C" fn nil_cancel_workshop_recruit_order(
247 request_id: RequestId,
248 req: *const c_char,
249) {
250 send!(request_id, cancel_workshop_recruit_order, req)
251}
252
253#[unsafe(no_mangle)]
254pub unsafe extern "C" fn nil_cheat_fill_world(request_id: RequestId, req: *const c_char) {
255 send!(request_id, cheat_fill_world, req)
256}
257
258#[unsafe(no_mangle)]
259pub unsafe extern "C" fn nil_cheat_get_academy_recruit_queue(
260 request_id: RequestId,
261 req: *const c_char,
262) {
263 send!(request_id, cheat_get_academy_recruit_queue, req)
264}
265
266#[unsafe(no_mangle)]
267pub unsafe extern "C" fn nil_cheat_get_academy_recruit_queues(
268 request_id: RequestId,
269 req: *const c_char,
270) {
271 send!(request_id, cheat_get_academy_recruit_queues, req)
272}
273
274#[unsafe(no_mangle)]
275pub unsafe extern "C" fn nil_cheat_get_all_academy_recruit_queues(
276 request_id: RequestId,
277 req: *const c_char,
278) {
279 send!(request_id, cheat_get_all_academy_recruit_queues, req)
280}
281
282#[unsafe(no_mangle)]
283pub unsafe extern "C" fn nil_cheat_get_all_prefecture_build_queues(
284 request_id: RequestId,
285 req: *const c_char,
286) {
287 send!(request_id, cheat_get_all_prefecture_build_queues, req)
288}
289
290#[unsafe(no_mangle)]
291pub unsafe extern "C" fn nil_cheat_get_all_stable_recruit_queues(
292 request_id: RequestId,
293 req: *const c_char,
294) {
295 send!(request_id, cheat_get_all_stable_recruit_queues, req)
296}
297
298#[unsafe(no_mangle)]
299pub unsafe extern "C" fn nil_cheat_get_build_steps(request_id: RequestId, req: *const c_char) {
300 send!(request_id, cheat_get_build_steps, req)
301}
302
303#[unsafe(no_mangle)]
304pub unsafe extern "C" fn nil_cheat_get_cities(request_id: RequestId, req: *const c_char) {
305 send!(request_id, cheat_get_cities, req)
306}
307
308#[unsafe(no_mangle)]
309pub unsafe extern "C" fn nil_cheat_get_city(request_id: RequestId, req: *const c_char) {
310 send!(request_id, cheat_get_city, req)
311}
312
313#[unsafe(no_mangle)]
314pub unsafe extern "C" fn nil_cheat_get_ethics(request_id: RequestId, req: *const c_char) {
315 send!(request_id, cheat_get_ethics, req)
316}
317
318#[unsafe(no_mangle)]
319pub unsafe extern "C" fn nil_cheat_get_idle_armies_at(request_id: RequestId, req: *const c_char) {
320 send!(request_id, cheat_get_idle_armies_at, req)
321}
322
323#[unsafe(no_mangle)]
324pub unsafe extern "C" fn nil_cheat_get_idle_personnel_at(
325 request_id: RequestId,
326 req: *const c_char,
327) {
328 send!(request_id, cheat_get_idle_personnel_at, req)
329}
330
331#[unsafe(no_mangle)]
332pub unsafe extern "C" fn nil_cheat_get_infrastructure(request_id: RequestId, req: *const c_char) {
333 send!(request_id, cheat_get_infrastructure, req)
334}
335
336#[unsafe(no_mangle)]
337pub unsafe extern "C" fn nil_cheat_get_maneuvers(request_id: RequestId, req: *const c_char) {
338 send!(request_id, cheat_get_maneuvers, req)
339}
340
341#[unsafe(no_mangle)]
342pub unsafe extern "C" fn nil_cheat_get_maneuvers_of(request_id: RequestId, req: *const c_char) {
343 send!(request_id, cheat_get_maneuvers_of, req)
344}
345
346#[unsafe(no_mangle)]
347pub unsafe extern "C" fn nil_cheat_get_player(request_id: RequestId, req: *const c_char) {
348 send!(request_id, cheat_get_player, req)
349}
350
351#[unsafe(no_mangle)]
352pub unsafe extern "C" fn nil_cheat_get_players(request_id: RequestId, req: *const c_char) {
353 send!(request_id, cheat_get_players, req)
354}
355
356#[unsafe(no_mangle)]
357pub unsafe extern "C" fn nil_cheat_get_prefecture_build_queue(
358 request_id: RequestId,
359 req: *const c_char,
360) {
361 send!(request_id, cheat_get_prefecture_build_queue, req)
362}
363
364#[unsafe(no_mangle)]
365pub unsafe extern "C" fn nil_cheat_get_prefecture_build_queues(
366 request_id: RequestId,
367 req: *const c_char,
368) {
369 send!(request_id, cheat_get_prefecture_build_queues, req)
370}
371
372#[unsafe(no_mangle)]
373pub unsafe extern "C" fn nil_cheat_get_resources(request_id: RequestId, req: *const c_char) {
374 send!(request_id, cheat_get_resources, req)
375}
376
377#[unsafe(no_mangle)]
378pub unsafe extern "C" fn nil_cheat_get_stable_recruit_queue(
379 request_id: RequestId,
380 req: *const c_char,
381) {
382 send!(request_id, cheat_get_stable_recruit_queue, req)
383}
384
385#[unsafe(no_mangle)]
386pub unsafe extern "C" fn nil_cheat_get_stable_recruit_queues(
387 request_id: RequestId,
388 req: *const c_char,
389) {
390 send!(request_id, cheat_get_stable_recruit_queues, req)
391}
392
393#[unsafe(no_mangle)]
394pub unsafe extern "C" fn nil_cheat_get_storage_capacity(request_id: RequestId, req: *const c_char) {
395 send!(request_id, cheat_get_storage_capacity, req)
396}
397
398#[unsafe(no_mangle)]
399pub unsafe extern "C" fn nil_cheat_set_bot_ethics(request_id: RequestId, req: *const c_char) {
400 send!(request_id, cheat_set_bot_ethics, req)
401}
402
403#[unsafe(no_mangle)]
404pub unsafe extern "C" fn nil_cheat_set_building_level(request_id: RequestId, req: *const c_char) {
405 send!(request_id, cheat_set_building_level, req)
406}
407
408#[unsafe(no_mangle)]
409pub unsafe extern "C" fn nil_cheat_set_food(request_id: RequestId, req: *const c_char) {
410 send!(request_id, cheat_set_food, req)
411}
412
413#[unsafe(no_mangle)]
414pub unsafe extern "C" fn nil_cheat_set_iron(request_id: RequestId, req: *const c_char) {
415 send!(request_id, cheat_set_iron, req)
416}
417
418#[unsafe(no_mangle)]
419pub unsafe extern "C" fn nil_cheat_set_max_food(request_id: RequestId, req: *const c_char) {
420 send!(request_id, cheat_set_max_food, req)
421}
422
423#[unsafe(no_mangle)]
424pub unsafe extern "C" fn nil_cheat_set_max_infrastructure(
425 request_id: RequestId,
426 req: *const c_char,
427) {
428 send!(request_id, cheat_set_max_infrastructure, req)
429}
430
431#[unsafe(no_mangle)]
432pub unsafe extern "C" fn nil_cheat_set_max_iron(request_id: RequestId, req: *const c_char) {
433 send!(request_id, cheat_set_max_iron, req)
434}
435
436#[unsafe(no_mangle)]
437pub unsafe extern "C" fn nil_cheat_set_max_resources(request_id: RequestId, req: *const c_char) {
438 send!(request_id, cheat_set_max_resources, req)
439}
440
441#[unsafe(no_mangle)]
442pub unsafe extern "C" fn nil_cheat_set_max_silo_resources(
443 request_id: RequestId,
444 req: *const c_char,
445) {
446 send!(request_id, cheat_set_max_silo_resources, req)
447}
448
449#[unsafe(no_mangle)]
450pub unsafe extern "C" fn nil_cheat_set_max_stone(request_id: RequestId, req: *const c_char) {
451 send!(request_id, cheat_set_max_stone, req)
452}
453
454#[unsafe(no_mangle)]
455pub unsafe extern "C" fn nil_cheat_set_max_warehouse_resources(
456 request_id: RequestId,
457 req: *const c_char,
458) {
459 send!(request_id, cheat_set_max_warehouse_resources, req)
460}
461
462#[unsafe(no_mangle)]
463pub unsafe extern "C" fn nil_cheat_set_max_wood(request_id: RequestId, req: *const c_char) {
464 send!(request_id, cheat_set_max_wood, req)
465}
466
467#[unsafe(no_mangle)]
468pub unsafe extern "C" fn nil_cheat_set_resources(request_id: RequestId, req: *const c_char) {
469 send!(request_id, cheat_set_resources, req)
470}
471
472#[unsafe(no_mangle)]
473pub unsafe extern "C" fn nil_cheat_set_stability(request_id: RequestId, req: *const c_char) {
474 send!(request_id, cheat_set_stability, req)
475}
476
477#[unsafe(no_mangle)]
478pub unsafe extern "C" fn nil_cheat_set_stone(request_id: RequestId, req: *const c_char) {
479 send!(request_id, cheat_set_stone, req)
480}
481
482#[unsafe(no_mangle)]
483pub unsafe extern "C" fn nil_cheat_set_wood(request_id: RequestId, req: *const c_char) {
484 send!(request_id, cheat_set_wood, req)
485}
486
487#[unsafe(no_mangle)]
488pub unsafe extern "C" fn nil_cheat_skip_round(request_id: RequestId, req: *const c_char) {
489 send!(request_id, cheat_skip_round, req)
490}
491
492#[unsafe(no_mangle)]
493pub unsafe extern "C" fn nil_cheat_spawn_bot(request_id: RequestId, req: *const c_char) {
494 send!(request_id, cheat_spawn_bot, req)
495}
496
497#[unsafe(no_mangle)]
498pub unsafe extern "C" fn nil_cheat_spawn_city(request_id: RequestId, req: *const c_char) {
499 send!(request_id, cheat_spawn_city, req)
500}
501
502#[unsafe(no_mangle)]
503pub unsafe extern "C" fn nil_cheat_spawn_personnel(request_id: RequestId, req: *const c_char) {
504 send!(request_id, cheat_spawn_personnel, req)
505}
506
507#[unsafe(no_mangle)]
508pub unsafe extern "C" fn nil_create_remote_world(request_id: RequestId, req: *const c_char) {
509 send!(request_id, create_remote_world, req)
510}
511
512#[unsafe(no_mangle)]
513pub unsafe extern "C" fn nil_create_user(request_id: RequestId, req: *const c_char) {
514 send!(request_id, create_user, req)
515}
516
517#[unsafe(no_mangle)]
518pub unsafe extern "C" fn nil_delete_remote_world(request_id: RequestId, req: *const c_char) {
519 send!(request_id, delete_remote_world, req)
520}
521
522#[unsafe(no_mangle)]
523pub unsafe extern "C" fn nil_forward_report(request_id: RequestId, req: *const c_char) {
524 send!(request_id, forward_report, req)
525}
526
527#[unsafe(no_mangle)]
528pub unsafe extern "C" fn nil_get_academy_recruit_catalog(
529 request_id: RequestId,
530 req: *const c_char,
531) {
532 send!(request_id, get_academy_recruit_catalog, req)
533}
534
535#[unsafe(no_mangle)]
536pub unsafe extern "C" fn nil_get_armies(request_id: RequestId, req: *const c_char) {
537 send!(request_id, get_armies, req)
538}
539
540#[unsafe(no_mangle)]
541pub unsafe extern "C" fn nil_get_army(request_id: RequestId, req: *const c_char) {
542 send!(request_id, get_army, req)
543}
544
545#[unsafe(no_mangle)]
546pub unsafe extern "C" fn nil_get_army_owner(request_id: RequestId, req: *const c_char) {
547 send!(request_id, get_army_owner, req)
548}
549
550#[unsafe(no_mangle)]
551pub unsafe extern "C" fn nil_get_bot_coords(request_id: RequestId, req: *const c_char) {
552 send!(request_id, get_bot_coords, req)
553}
554
555#[unsafe(no_mangle)]
556pub unsafe extern "C" fn nil_get_chat_history(request_id: RequestId, req: *const c_char) {
557 send!(request_id, get_chat_history, req)
558}
559
560#[unsafe(no_mangle)]
561pub unsafe extern "C" fn nil_get_cities(request_id: RequestId, req: *const c_char) {
562 send!(request_id, get_cities, req)
563}
564
565#[unsafe(no_mangle)]
566pub unsafe extern "C" fn nil_get_city(request_id: RequestId, req: *const c_char) {
567 send!(request_id, get_city, req)
568}
569
570#[unsafe(no_mangle)]
571pub unsafe extern "C" fn nil_get_city_score(request_id: RequestId, req: *const c_char) {
572 send!(request_id, get_city_score, req)
573}
574
575#[unsafe(no_mangle)]
576pub unsafe extern "C" fn nil_get_continent_size(request_id: RequestId, req: *const c_char) {
577 send!(request_id, get_continent_size, req)
578}
579
580#[unsafe(no_mangle)]
581pub unsafe extern "C" fn nil_get_idle_armies_at(request_id: RequestId, req: *const c_char) {
582 send!(request_id, get_idle_armies_at, req)
583}
584
585#[unsafe(no_mangle)]
586pub unsafe extern "C" fn nil_get_idle_armies_coords(request_id: RequestId, req: *const c_char) {
587 send!(request_id, get_idle_armies_coords, req)
588}
589
590#[unsafe(no_mangle)]
591pub unsafe extern "C" fn nil_get_maneuver(request_id: RequestId, req: *const c_char) {
592 send!(request_id, get_maneuver, req)
593}
594
595#[unsafe(no_mangle)]
596pub unsafe extern "C" fn nil_get_player(request_id: RequestId, req: *const c_char) {
597 send!(request_id, get_player, req)
598}
599
600#[unsafe(no_mangle)]
601pub unsafe extern "C" fn nil_get_player_coords(request_id: RequestId, req: *const c_char) {
602 send!(request_id, get_player_coords, req)
603}
604
605#[unsafe(no_mangle)]
606pub unsafe extern "C" fn nil_get_player_ids(request_id: RequestId, req: *const c_char) {
607 send!(request_id, get_player_ids, req)
608}
609
610#[unsafe(no_mangle)]
611pub unsafe extern "C" fn nil_get_player_maintenance(request_id: RequestId, req: *const c_char) {
612 send!(request_id, get_player_maintenance, req)
613}
614
615#[unsafe(no_mangle)]
616pub unsafe extern "C" fn nil_get_player_military(request_id: RequestId, req: *const c_char) {
617 send!(request_id, get_player_military, req)
618}
619
620#[unsafe(no_mangle)]
621pub unsafe extern "C" fn nil_get_player_status(request_id: RequestId, req: *const c_char) {
622 send!(request_id, get_player_status, req)
623}
624
625#[unsafe(no_mangle)]
626pub unsafe extern "C" fn nil_get_player_storage_capacity(
627 request_id: RequestId,
628 req: *const c_char,
629) {
630 send!(request_id, get_player_storage_capacity, req)
631}
632
633#[unsafe(no_mangle)]
634pub unsafe extern "C" fn nil_get_player_worlds(request_id: RequestId, req: *const c_char) {
635 send!(request_id, get_player_worlds, req)
636}
637
638#[unsafe(no_mangle)]
639pub unsafe extern "C" fn nil_get_precursor_coords(request_id: RequestId, req: *const c_char) {
640 send!(request_id, get_precursor_coords, req)
641}
642
643#[unsafe(no_mangle)]
644pub unsafe extern "C" fn nil_get_prefecture_build_catalog(
645 request_id: RequestId,
646 req: *const c_char,
647) {
648 send!(request_id, get_prefecture_build_catalog, req)
649}
650
651#[unsafe(no_mangle)]
652pub unsafe extern "C" fn nil_get_public_bot(request_id: RequestId, req: *const c_char) {
653 send!(request_id, get_public_bot, req)
654}
655
656#[unsafe(no_mangle)]
657pub unsafe extern "C" fn nil_get_public_bots(request_id: RequestId, req: *const c_char) {
658 send!(request_id, get_public_bots, req)
659}
660
661#[unsafe(no_mangle)]
662pub unsafe extern "C" fn nil_get_public_cities(request_id: RequestId, req: *const c_char) {
663 send!(request_id, get_public_cities, req)
664}
665
666#[unsafe(no_mangle)]
667pub unsafe extern "C" fn nil_get_public_city(request_id: RequestId, req: *const c_char) {
668 send!(request_id, get_public_city, req)
669}
670
671#[unsafe(no_mangle)]
672pub unsafe extern "C" fn nil_get_public_field(request_id: RequestId, req: *const c_char) {
673 send!(request_id, get_public_field, req)
674}
675
676#[unsafe(no_mangle)]
677pub unsafe extern "C" fn nil_get_public_fields(request_id: RequestId, req: *const c_char) {
678 send!(request_id, get_public_fields, req)
679}
680
681#[unsafe(no_mangle)]
682pub unsafe extern "C" fn nil_get_public_player(request_id: RequestId, req: *const c_char) {
683 send!(request_id, get_public_player, req)
684}
685
686#[unsafe(no_mangle)]
687pub unsafe extern "C" fn nil_get_public_players(request_id: RequestId, req: *const c_char) {
688 send!(request_id, get_public_players, req)
689}
690
691#[unsafe(no_mangle)]
692pub unsafe extern "C" fn nil_get_public_precursor(request_id: RequestId, req: *const c_char) {
693 send!(request_id, get_public_precursor, req)
694}
695
696#[unsafe(no_mangle)]
697pub unsafe extern "C" fn nil_get_public_precursors(request_id: RequestId, req: *const c_char) {
698 send!(request_id, get_public_precursors, req)
699}
700
701#[unsafe(no_mangle)]
702pub unsafe extern "C" fn nil_get_rank(request_id: RequestId, req: *const c_char) {
703 send!(request_id, get_rank, req)
704}
705
706#[unsafe(no_mangle)]
707pub unsafe extern "C" fn nil_get_ranking(request_id: RequestId, req: *const c_char) {
708 send!(request_id, get_ranking, req)
709}
710
711#[unsafe(no_mangle)]
712pub unsafe extern "C" fn nil_get_remote_world(request_id: RequestId, req: *const c_char) {
713 send!(request_id, get_remote_world, req)
714}
715
716#[unsafe(no_mangle)]
717pub unsafe extern "C" fn nil_get_remote_world_limit(request_id: RequestId) {
718 send!(request_id, get_remote_world_limit)
719}
720
721#[unsafe(no_mangle)]
722pub unsafe extern "C" fn nil_get_remote_world_limit_per_user(request_id: RequestId) {
723 send!(request_id, get_remote_world_limit_per_user)
724}
725
726#[unsafe(no_mangle)]
727pub unsafe extern "C" fn nil_get_remote_worlds(request_id: RequestId) {
728 send!(request_id, get_remote_worlds)
729}
730
731#[unsafe(no_mangle)]
732pub unsafe extern "C" fn nil_get_round(request_id: RequestId, req: *const c_char) {
733 send!(request_id, get_round, req)
734}
735
736#[unsafe(no_mangle)]
737pub unsafe extern "C" fn nil_get_server_kind(request_id: RequestId) {
738 send!(request_id, get_server_kind)
739}
740
741#[unsafe(no_mangle)]
742pub unsafe extern "C" fn nil_get_stable_recruit_catalog(request_id: RequestId, req: *const c_char) {
743 send!(request_id, get_stable_recruit_catalog, req)
744}
745
746#[unsafe(no_mangle)]
747pub unsafe extern "C" fn nil_get_workshop_recruit_catalog(
748 request_id: RequestId,
749 req: *const c_char,
750) {
751 send!(request_id, get_workshop_recruit_catalog, req)
752}
753
754#[unsafe(no_mangle)]
755pub unsafe extern "C" fn nil_get_world_bots(request_id: RequestId, req: *const c_char) {
756 send!(request_id, get_world_bots, req)
757}
758
759#[unsafe(no_mangle)]
760pub unsafe extern "C" fn nil_get_world_config(request_id: RequestId, req: *const c_char) {
761 send!(request_id, get_world_config, req)
762}
763
764#[unsafe(no_mangle)]
765pub unsafe extern "C" fn nil_get_world_personnel(request_id: RequestId, req: *const c_char) {
766 send!(request_id, get_world_personnel, req)
767}
768
769#[unsafe(no_mangle)]
770pub unsafe extern "C" fn nil_get_world_players(request_id: RequestId, req: *const c_char) {
771 send!(request_id, get_world_players, req)
772}
773
774#[unsafe(no_mangle)]
775pub unsafe extern "C" fn nil_get_world_precursors(request_id: RequestId, req: *const c_char) {
776 send!(request_id, get_world_precursors, req)
777}
778
779#[unsafe(no_mangle)]
780pub unsafe extern "C" fn nil_get_world_stats(request_id: RequestId, req: *const c_char) {
781 send!(request_id, get_world_stats, req)
782}
783
784#[unsafe(no_mangle)]
785pub unsafe extern "C" fn nil_player_exists(request_id: RequestId, req: *const c_char) {
786 send!(request_id, player_exists, req)
787}
788
789#[unsafe(no_mangle)]
790pub unsafe extern "C" fn nil_push_chat_message(request_id: RequestId, req: *const c_char) {
791 send!(request_id, push_chat_message, req)
792}
793
794#[unsafe(no_mangle)]
795pub unsafe extern "C" fn nil_rename_city(request_id: RequestId, req: *const c_char) {
796 send!(request_id, rename_city, req)
797}
798
799#[unsafe(no_mangle)]
800pub unsafe extern "C" fn nil_request_maneuver(request_id: RequestId, req: *const c_char) {
801 send!(request_id, request_maneuver, req)
802}
803
804#[unsafe(no_mangle)]
805pub unsafe extern "C" fn nil_save_local_world(request_id: RequestId, req: *const c_char) {
806 send!(request_id, save_local_world, req)
807}
808
809#[unsafe(no_mangle)]
810pub unsafe extern "C" fn nil_search_city(request_id: RequestId, req: *const c_char) {
811 send!(request_id, search_city, req)
812}
813
814#[unsafe(no_mangle)]
815pub unsafe extern "C" fn nil_search_public_city(request_id: RequestId, req: *const c_char) {
816 send!(request_id, search_public_city, req)
817}
818
819#[unsafe(no_mangle)]
820pub unsafe extern "C" fn nil_server_version(request_id: RequestId) {
821 send!(request_id, version)
822}
823
824#[unsafe(no_mangle)]
825pub unsafe extern "C" fn nil_set_player_ready(request_id: RequestId, req: *const c_char) {
826 send!(request_id, set_player_ready, req)
827}
828
829#[unsafe(no_mangle)]
830pub unsafe extern "C" fn nil_set_player_status(request_id: RequestId, req: *const c_char) {
831 send!(request_id, set_player_status, req)
832}
833
834#[unsafe(no_mangle)]
835pub unsafe extern "C" fn nil_simulate_battle(request_id: RequestId, req: *const c_char) {
836 send!(request_id, simulate_battle, req)
837}
838
839#[unsafe(no_mangle)]
840pub unsafe extern "C" fn nil_spawn_player(request_id: RequestId, req: *const c_char) {
841 send!(request_id, spawn_player, req)
842}
843
844#[unsafe(no_mangle)]
845pub unsafe extern "C" fn nil_start_round(request_id: RequestId, req: *const c_char) {
846 send!(request_id, start_round, req)
847}
848
849#[unsafe(no_mangle)]
850pub unsafe extern "C" fn nil_toggle_building(request_id: RequestId, req: *const c_char) {
851 send!(request_id, toggle_building, req)
852}
853
854#[unsafe(no_mangle)]
855pub unsafe extern "C" fn nil_user_exists(request_id: RequestId, req: *const c_char) {
856 send!(request_id, user_exists, req)
857}
858
859#[unsafe(no_mangle)]
860pub unsafe extern "C" fn nil_validate_token(request_id: RequestId, req: *const c_char) {
861 send!(request_id, validate_token, req)
862}