aboutsummaryrefslogtreecommitdiff
path: root/examples/ffi.py
blob: 4d609b655df2b162e0e84c4ae46a9166ba082d00 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import sys
from cffi import FFI

prefix: str = {"win32": ""}.get(sys.platform, "lib")
extension: str = {"darwin": ".dylib", "win32": ".dll"}.get(sys.platform, ".so")

ffi = FFI()
ffi.cdef(
  """
  extern const char *SENPY_CLUB_API_BASE_URL;
  extern int SENPY_CLUB_API_CURRENT_VERSION;
  extern const char *SENPY_CLUB_API_URL;
  
  struct Random { char *language; char *image; };
  
  char **language(const char *);
  
  char **languages(void);
  
  struct Random *random_new(void);
  void random_populate(struct Random *);
  void random_free(struct Random *);
  char *random_get(const struct Random *, const char *);
  
  int status(void);
  """
)

C = ffi.dlopen("target/debug/{}senpy_ffi{}".format(prefix, extension))

# languages
languages = C.languages()
languages_list: list[str] = []

for i in range(int(ffi.string(languages[0]))):
  languages_list.append(ffi.string(languages[i]).decode("utf-8"))

languages_list.pop(0)

print("languages:", languages_list)

# random
class Random:
  def __init__(self) -> None:
    self.obj = C.random_new()

  def __enter__(self):
    return self

  def __exit__(self, _, __, ___) -> None:
    C.random_free(self.obj)

  def populate(self) -> None:
    C.random_populate(self.obj)

  def get(self) -> (str, str):
    return (
      ffi.string(C.random_get(self.obj, "language".encode("utf-8"))).decode("utf-8"),
      ffi.string(C.random_get(self.obj, "image".encode("utf-8"))).decode("utf-8"),
    )

with Random() as random:
  random.populate()
  print("random:", random.get())

# status
c_status: int = C.status()
status: str = ""

if c_status == 1:
  status = "up"
elif c_status == 0:
  status = "down"
elif c_status == -1:
  status = "not down, but unreachable"
else:
  status = "unknown"

print("status: api.senpy.club is", status)

# language
images = C.language("ASM".encode("utf-8"))
images_list: list[str] = []

for i in range(int(ffi.string(images[0]))):
  images_list.append(ffi.string(images[i]).decode("utf-8"))

images_list.pop(0)

print("images:", images_list)

print("api base url:", ffi.string(C.SENPY_CLUB_API_BASE_URL).decode("utf-8"))
print("api current version:", int(C.SENPY_CLUB_API_CURRENT_VERSION))
print("api url:", ffi.string(C.SENPY_CLUB_API_URL).decode("utf-8"))