aboutsummaryrefslogtreecommitdiff
path: root/src/server/s2c_sender.c
blob: 37e9ffce39de5b591d14d0d7647e9069c2b6ec45 (plain)
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
#include <server/s2c_sender.h>

internal_var Arena s_send_arena;

void
send_s2c_chat_message(ClientConnection *conn, String32 *username, String32 *content, OSTime now)
{
    OSTime time = os_time_get_now();
    Arena *arena = &s_send_arena;


    S2C_ChatMessage *chat_message = arena_push(arena, sizeof(S2C_ChatMessage));

    String32 *username_copy = string32_create_from_string32(arena, username);
    chat_message->username = (String32*)((u8*)username_copy - (u8*)chat_message);

    String32 *content_copy = string32_create_from_string32(arena, content);
    chat_message->content = (String32*)((u8*)content_copy - (u8*)chat_message);

    chat_message->epoch_time_seconds = time.seconds;
    chat_message->epoch_time_nanoseconds = time.nanoseconds;

    chat_message->header.type = S2C_CHAT_MESSAGE;
    chat_message->header.size = arena->size_used;


    os_net_secure_stream_send(conn->secure_stream_id, arena->memory, arena->size_used);
    arena_clear(arena);
}


void
send_s2c_user_update(ClientConnection *conn, String32 *username, u32 online_status)
{
    Arena *arena = &s_send_arena;


    S2C_UserUpdate *user_update = arena_push(arena, sizeof(S2C_UserUpdate));

    user_update->status = online_status;

    String32 *username_copy = string32_create_from_string32(arena, username);
    user_update->username = (String32*)((u8*)username_copy - (u8*)user_update);

    user_update->header.type = S2C_USER_UPDATE;
    user_update->header.size = arena->size_used;


    os_net_secure_stream_send(conn->secure_stream_id, arena->memory, arena->size_used);
    arena_clear(arena);
}


void
send_s2c_login(ClientConnection *conn, u32 login_result)
{
    Arena *arena = &s_send_arena;


    S2C_Login *login = arena_push(arena, sizeof(S2C_Login));
    login->login_result = login_result;

    login->header.type = S2C_LOGIN;
    login->header.size = arena->size_used;


    os_net_secure_stream_send(conn->secure_stream_id, arena->memory, arena->size_used);
    arena_clear(arena);
}


void
s2c_sender_init(Arena *arena)
{
    arena_init(&s_send_arena, 1408);
}