-
Notifications
You must be signed in to change notification settings - Fork 1
/
player_list.c
102 lines (82 loc) · 2.61 KB
/
player_list.c
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
95
96
97
98
99
100
#include "player_list.h"
void * decode_player(void * data, struct player * pl) {
void * ptr = data;
uint8_t len;
/* Retreive the public ID */
pl->public_id = GUINT32_FROM_LE(*(uint32_t *) ptr);
ptr = (uint32_t *)ptr + 1;
/* Retreive the channel ID */
pl->channel_id = GUINT32_FROM_LE(*(uint32_t *) ptr);
ptr = (uint32_t *)ptr + 1;
/* Retreive the channel privileges */
pl->chan_privileges = GUINT16_FROM_LE(*(uint16_t *) ptr);
ptr = (uint16_t *)ptr + 1;
/* Retreive the channel privileges */
pl->global_flags = GUINT16_FROM_LE(*(uint16_t *) ptr);
ptr = (uint16_t *)ptr + 1;
/* Retreive the player attributes */
pl->player_attributes = GUINT16_FROM_LE(*(uint16_t *) ptr);
ptr = (uint16_t *)ptr + 1;
len = *(uint8_t *)ptr;
ptr = (uint8_t *)ptr +1;
strncpy(pl->name, (char *)ptr, len);
ptr = (char*)ptr + 29;
return ptr;
}
void print_player(struct player * pl) {
printf(" id: %i\n", pl->public_id);
printf(" name: %s\n", pl->name);
printf(" global flags: ");
if(pl->global_flags & GLOBAL_FLAG_SERVERADMIN)
printf("SA, ");
if(pl->global_flags & GLOBAL_FLAG_ALLOWREG)
printf("reg allowed, ");
if(pl->global_flags & GLOBAL_FLAG_REGISTERED) {
printf("R\n");
}
else {
printf("U\n");
}
printf(" channel privileges: ");
if(pl->chan_privileges & CHANNEL_PRIV_CHANADMIN)
printf("CA ");
if(pl->chan_privileges & CHANNEL_PRIV_OP)
printf("OP ");
if(pl->chan_privileges & CHANNEL_PRIV_VOICE)
printf("V ");
if(pl->chan_privileges & CHANNEL_PRIV_AUTOOP)
printf("AOP ");
if(pl->chan_privileges & CHANNEL_PRIV_AUTOVOICE)
printf("AV ");
printf("\n");
printf(" player attributes: ");
if(pl->player_attributes & PL_ATTR_BLOCK_WHISPER)
printf("block whispers ");
if(pl->player_attributes & PL_ATTR_AWAY)
printf("away ");
if(pl->player_attributes & PL_ATTR_MUTE_MIC)
printf("mic muted ");
if(pl->player_attributes & PL_ATTR_MUTE_SPK)
printf("speaker muted ");
printf("\n");
}
void print_player_list(struct player_list * pll) {
int i;
printf("Player list : (%i players)\n", pll->size);
for(i=0 ; i<pll->size ; i++) {
print_player(& pll->players[i]);
}
}
struct player_list * decode_player_list(void * data) {
int i;
void * ptr = data;
struct player_list * pll = (struct player_list *)calloc(sizeof(struct player_list), 1);
ptr = (uint32_t *)ptr + 6;
pll->size = GUINT32_FROM_LE(*(uint32_t *)ptr);
pll->players = (struct player *)calloc(sizeof(struct player), pll->size);
ptr = (uint32_t *)ptr +1;
for(i=0 ; i<pll->size ; i++) {
ptr = decode_player(ptr, & pll->players[i]);
}
return pll;
}