/* * vim: softtabstop=4 shiftwidth=4 cindent foldmethod=marker expandtab * * $LastChangedDate$ * $Revision$ * $LastChangedBy$ * $URL$ * * Copyright 2009-2011 Eric Connell * * This file is part of Mangler. * * Mangler is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Mangler is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Mangler. If not, see . */ #ifndef _VENTRILO3_H #define _VENTRILO3_H #include #include #include #include #include #include #include #include #include #include #include #include #ifdef DMALLOC #include #endif #define V3_BLOCK 1 #define V3_NONBLOCK 0 #define V3_OK 0 #define V3_MALFORMED 1 #define V3_NOTIMPL 2 #define V3_FAILURE 3 #define V3_ADD_CHANNEL 0x01 #define V3_REMOVE_CHANNEL 0x02 #define V3_CHANGE_CHANNEL 0x03 #define V3_MODIFY_CHANNEL 0x05 #define V3_AUTHFAIL_CHANNEL 0x07 #define V3_JOIN_CHAT 0x00 #define V3_LEAVE_CHAT 0x01 #define V3_TALK_CHAT 0x02 #define V3_RCON_CHAT 0x03 #define V3_JOINFAIL_CHAT 0x04 #define V3_START_PRIV_CHAT 0x00 #define V3_END_PRIV_CHAT 0x01 #define V3_TALK_PRIV_CHAT 0x02 #define V3_BACK_PRIV_CHAT 0x03 #define V3_AWAY_PRIV_CHAT 0x04 #define V3_RANK_LIST 0x00 #define V3_OPEN_RANK 0x01 #define V3_CLOSE_RANK 0x02 #define V3_ADD_RANK 0x03 #define V3_REMOVE_RANK 0x04 #define V3_MODIFY_RANK 0x05 #define V3_REMOVE_USER 0x00 #define V3_ADD_USER 0x01 #define V3_MODIFY_USER 0x02 #define V3_USER_LIST 0x04 #define V3_RANKCHANGE_USER 0x06 #define V3_AUDIO_START 0x00 #define V3_AUDIO_DATA 0x01 #define V3_AUDIO_STOP 0x02 #define V3_AUDIO_MUTE 0x03 #define V3_AUDIO_START_LOGIN 0x04 #define V3_AUDIO_QUEUE_AVAIL 0x05 #define V3_AUDIO_QUEUE_TAKEN 0x06 #define V3_PHANTOM_ADD 0x00 #define V3_PHANTOM_REMOVE 0x01 #define V3_ADMIN_LOGIN 0x00 #define V3_ADMIN_KICK 0x01 #define V3_ADMIN_BAN 0x03 #define V3_ADMIN_LOGOUT 0x04 #define V3_ADMIN_CHANNEL_BAN 0x05 #define V3_USERLIST_OPEN 0x00 #define V3_USERLIST_ADD 0x01 #define V3_USERLIST_REMOVE 0x02 #define V3_USERLIST_MODIFY 0x03 #define V3_USERLIST_CLOSE 0x04 #define V3_USERLIST_LUSER 0x05 #define V3_USERLIST_CHANGE_OWNER 0x06 #define V3_SERVER_RECV_SETTING 0x00 #define V3_SERVER_SEND_SETTING 0x01 #define V3_SERVER_CLIENT_SET 0x02 #define V3_SERVER_SEND_DONE 0x03 #define V3_SERVER_TRANSACTION_DONE 0x04 #define V3_SRV_PROP_INIT 0x00 #define V3_SRV_PROP_START 0x01 #define V3_SRV_PROP_CHAT_FILTER 0x02 #define V3_SRV_PROP_CHAN_ORDER 0x03 #define V3_SRV_PROP_MOTD_ALWAYS 0x05 #define V3_SRV_PROP_CHAT_SPAM_FILT 0x07 #define V3_SRV_PROP_COMMENT_SPAM_FILT 0x08 #define V3_SRV_PROP_WAVE_SPAM_FILT 0x09 #define V3_SRV_PROP_TTS_SPAM_FILT 0x0A #define V3_SRV_PROP_INACTIVE_TIMEOUT 0x0B #define V3_SRV_PROP_INACTIVE_ACTION 0x0C #define V3_SRV_PROP_INACTIVE_CHAN 0x0D #define V3_SRV_PROP_REM_SRV_COMMENT 0x0E #define V3_SRV_PROP_REM_CHAN_NAMES 0x0F #define V3_SRV_PROP_REM_CHAN_COMMENTS 0x10 #define V3_SRV_PROP_REM_USER_NAMES 0x11 #define V3_SRV_PROP_REM_USER_COMMENTS 0x12 #define V3_SRV_PROP_COMMENT 0x13 #define V3_SRV_PROP_WAVE_BIND_FILT 0x14 #define V3_SRV_PROP_TTS_BIND_FILT 0x15 #define V3_SRV_PROP_CHAN_SPAM_FILT 0x16 #define V3_SRV_PROP_REM_SHOW_LOGIN 0x18 #define V3_SRV_PROP_MAX_GUEST_LOGIN 0x19 #define V3_SRV_PROP_AUTOKICK_TIME 0x1A #define V3_SRV_PROP_AUTOBAN_TIME 0x1B #define V3_SRV_PROP_FINISH 0x1C #define V3_ADMIN_BAN_LIST 0x00 #define V3_ADMIN_BAN_REMOVE 0x01 #define V3_ADMIN_BAN_ADD 0x02 #define V3_DEBUG_NONE 0 #define V3_DEBUG_STATUS 1 #define V3_DEBUG_ERROR 1 << 2 #define V3_DEBUG_STACK 1 << 3 #define V3_DEBUG_INTERNAL 1 << 4 #define V3_DEBUG_PACKET 1 << 5 #define V3_DEBUG_PACKET_PARSE 1 << 6 #define V3_DEBUG_PACKET_ENCRYPTED 1 << 7 #define V3_DEBUG_MEMORY 1 << 8 #define V3_DEBUG_SOCKET 1 << 9 #define V3_DEBUG_NOTICE 1 << 10 #define V3_DEBUG_INFO 1 << 11 #define V3_DEBUG_MUTEX 1 << 12 #define V3_DEBUG_EVENT 1 << 13 #define V3_DEBUG_ALL 65535 typedef struct __v3_net_message {/*{{{*/ uint16_t len; uint16_t type; char *data; void *contents; int (* destroy)(struct __v3_net_message *msg); struct __v3_net_message *next; } _v3_net_message;/*}}}*/ struct _v3_permissions {/*{{{*/ uint16_t account_id; uint16_t replace_owner_id; uint8_t hash_password[32]; uint16_t rank_id; uint16_t unknown_perm_1; uint8_t lock_acct; uint8_t in_reserve_list; uint8_t dupe_ip; uint8_t switch_chan; uint16_t dfl_chan; uint8_t unknown_perm_2; uint8_t unknown_perm_3; uint8_t recv_bcast; uint8_t add_phantom; uint8_t record; uint8_t recv_complaint; uint8_t send_complaint; uint8_t inactive_exempt; uint8_t unknown_perm_4; uint8_t unknown_perm_5; uint8_t srv_admin; uint8_t add_user; uint8_t del_user; uint8_t ban_user; uint8_t kick_user; uint8_t move_user; uint8_t assign_chan_admin; uint8_t edit_rank; uint8_t edit_motd; uint8_t edit_guest_motd; uint8_t issue_rcon_cmd; uint8_t edit_voice_target; uint8_t edit_command_target; uint8_t assign_rank; uint8_t assign_reserved; uint8_t unknown_perm_6; uint8_t unknown_perm_7; uint8_t unknown_perm_8; uint8_t unknown_perm_9; uint8_t unknown_perm_10; uint8_t bcast; uint8_t bcast_lobby; uint8_t bcast_user; uint8_t bcast_x_chan; uint8_t send_tts_bind; uint8_t send_wav_bind; uint8_t send_page; uint8_t send_comment; uint8_t set_phon_name; uint8_t gen_comment_snds; uint8_t event_snds; uint8_t mute_glbl; uint8_t mute_other; uint8_t glbl_chat; uint8_t start_priv_chat; uint8_t unknown_perm_11; uint8_t eq_out; uint8_t unknown_perm_12; uint8_t unknown_perm_13; uint8_t unknown_perm_14; uint8_t see_guest; uint8_t see_nonguest; uint8_t see_motd; uint8_t see_srv_comment; uint8_t see_chan_list; uint8_t see_chan_comment; uint8_t see_user_comment; uint8_t unknown_perm_15; } __attribute__ ((__packed__));/*}}}*/ typedef struct _v3_permissions v3_permissions; /* * Define event types to be used by the caller's event handler. */ enum _v3_events { // inbound or outbound event types V3_EVENT_STATUS = 1, V3_EVENT_PING, V3_EVENT_USER_LOGIN, V3_EVENT_USER_LOGOUT, V3_EVENT_LOGIN_COMPLETE, V3_EVENT_LOGIN_FAIL, V3_EVENT_USER_CHAN_MOVE, V3_EVENT_CHAN_MOVE, V3_EVENT_CHAN_ADD, V3_EVENT_CHAN_MODIFY, // 10 V3_EVENT_CHAN_REMOVE, V3_EVENT_CHAN_BADPASS, V3_EVENT_ERROR_MSG, V3_EVENT_USER_TALK_START, V3_EVENT_USER_TALK_END, V3_EVENT_USER_TALK_MUTE, V3_EVENT_PLAY_AUDIO, V3_EVENT_RECORD_UPDATE, V3_EVENT_DISPLAY_MOTD, V3_EVENT_DISCONNECT, // 20 V3_EVENT_USER_MODIFY, V3_EVENT_CHAT_JOIN, V3_EVENT_CHAT_LEAVE, V3_EVENT_CHAT_MESSAGE, V3_EVENT_ADMIN_AUTH, V3_EVENT_CHAN_ADMIN_UPDATED, V3_EVENT_PRIVATE_CHAT_MESSAGE, V3_EVENT_PRIVATE_CHAT_START, V3_EVENT_PRIVATE_CHAT_END, V3_EVENT_PRIVATE_CHAT_AWAY, V3_EVENT_PRIVATE_CHAT_BACK, V3_EVENT_TEXT_TO_SPEECH_MESSAGE, V3_EVENT_PLAY_WAVE_FILE_MESSAGE, V3_EVENT_USERLIST_ADD, V3_EVENT_USERLIST_MODIFY, V3_EVENT_USERLIST_REMOVE, V3_EVENT_USERLIST_CHANGE_OWNER, V3_EVENT_USER_GLOBAL_MUTE_CHANGED, V3_EVENT_USER_CHANNEL_MUTE_CHANGED, V3_EVENT_PERMS_UPDATED, V3_EVENT_USER_RANK_CHANGE, V3_EVENT_SRV_PROP_RECV, V3_EVENT_SRV_PROP_SENT, V3_EVENT_ADMIN_BAN_LIST, // outbound specific event types V3_EVENT_CHANGE_CHANNEL, V3_EVENT_PHANTOM_ADD, V3_EVENT_PHANTOM_REMOVE, V3_EVENT_ADMIN_LOGIN, V3_EVENT_ADMIN_LOGOUT, V3_EVENT_ADMIN_KICK, V3_EVENT_ADMIN_BAN, V3_EVENT_ADMIN_CHANNEL_BAN, V3_EVENT_ADMIN_GLOBAL_MUTE, V3_EVENT_ADMIN_CHANNEL_MUTE, V3_EVENT_FORCE_CHAN_MOVE, V3_EVENT_USERLIST_OPEN, V3_EVENT_USERLIST_CLOSE, V3_EVENT_SRV_PROP_OPEN, V3_EVENT_SRV_PROP_CLOSE, V3_EVENT_SRV_PROP_UPDATE, V3_EVENT_ADMIN_BAN_ADD, V3_EVENT_ADMIN_BAN_REMOVE, // not implemented V3_EVENT_USER_PAGE, V3_EVENT_CHAN_REMOVED, V3_EVENT_CHAN_MODIFIED, V3_EVENT_SERVER_PROPERTY_UPDATED, V3_EVENT_RANKLIST_OPEN, V3_EVENT_RANKLIST_CLOSE, V3_EVENT_RANK_ADD, V3_EVENT_RANK_MODIFY, V3_EVENT_RANK_REMOVE, }; /* * Different boot types for the v3_admin_boot API. */ enum _v3_boot_types { V3_BOOT_KICK, V3_BOOT_BAN, V3_BOOT_CHANNEL_BAN, }; extern char *_v3_bitmasks[]; #define V3_AUDIO_SENDTYPE_UNK0 0x00 // possibly broadcast? #define V3_AUDIO_SENDTYPE_UNK1 0x01 // possibly broadcast to lobby? #define V3_AUDIO_SENDTYPE_U2CCUR 0x02 // user to current channel #define V3_AUDIO_SENDTYPE_U2C 0x03 // user to specific channel #define V3_AUDIO_SENDTYPE_U2CSUB 0x04 // user to channel and all subchannels #define V3_AUDIO_SENDTYPE_U2U 0x05 // user to user #define V3_AUDIO_SENDTYPE_U2TARG 0x06 // user to voice target // v3_event.flags values for V3_EVENT_USER_LOGIN #define V3_LOGIN_FLAGS_EXISTING (1 << 0) // user was added from userlist sent at login (existing user) typedef struct _v3_sp_filter { uint8_t action; uint16_t interval; uint8_t times; } v3_sp_filter; typedef struct { uint8_t chat_filter; uint8_t channel_order; uint8_t motd_always; v3_sp_filter chat_spam_filter; v3_sp_filter comment_spam_filter; v3_sp_filter wave_spam_filter; v3_sp_filter tts_spam_filter; uint32_t inactivity_timeout; uint8_t inactivity_action; uint16_t inactivity_channel; uint8_t rem_srv_comment; uint8_t rem_chan_names; uint8_t rem_chan_comments; uint8_t rem_user_names; uint8_t rem_user_comments; char server_comment[0x100]; uint8_t wave_bind_filter; uint8_t tts_bind_filter; v3_sp_filter channel_spam_filter; uint8_t rem_show_login_names; uint8_t max_guest; uint32_t autokick_time; uint32_t autoban_time; } v3_server_prop; typedef union _v3_event_data v3_event_data; union _v3_event_data { struct { v3_permissions perms; char username[32]; char owner[32]; char notes[256]; char lock_reason[128]; int chan_admin_count; uint16_t chan_admin[32]; int chan_auth_count; uint16_t chan_auth[32]; } account; struct { uint16_t id; uint16_t parent; uint8_t unknown_1; uint8_t password_protected; uint16_t unknown_2; uint16_t allow_recording; uint16_t allow_cross_channel_transmit; uint16_t allow_paging; uint16_t allow_wave_file_binds; uint16_t allow_tts_binds; uint16_t allow_u2u_transmit; uint16_t disable_guest_transmit; uint16_t disable_sound_events; uint16_t voice_mode; uint16_t transmit_time_limit; uint16_t allow_phantoms; uint16_t max_clients; uint16_t allow_guests; uint16_t inactive_exempt; uint16_t protect_mode; uint16_t transmit_rank_level; uint16_t channel_codec; uint16_t channel_format; uint16_t allow_voice_target; uint16_t allow_command_target; } channel; v3_server_prop srvprop; struct { uint16_t id; uint16_t count; uint16_t bitmask_id; uint32_t ip_address; char user[32]; char by[32]; char reason[128]; } ban; struct { uint16_t id; uint16_t level; } rank; int16_t sample16[16384]; uint8_t sample[32768]; char motd[32768]; char chatmessage[256]; char reason[128]; }; typedef struct _v3_event v3_event; struct _v3_event { uint16_t type; time_t timestamp; struct { uint8_t percent; char message[256]; } status; struct { uint16_t code; uint8_t disconnected; char message[512]; } error; uint16_t ping; struct { uint16_t id; uint16_t privchat_user1; uint16_t privchat_user2; } user; struct { uint16_t id; } channel; struct { uint16_t id; uint16_t id2; } account; struct { char name[32]; char password[32]; char phonetic[32]; char comment[128]; char url[128]; char integration_text[128]; } text; uint32_t flags; struct { uint32_t length; uint16_t send_type; uint32_t rate; uint8_t channels; } pcm; struct { uint32_t index; uint32_t time; uint8_t stopped; uint8_t flushed; } record; struct { uint16_t property; uint8_t value; } serverproperty; v3_event *next; v3_event_data *data; }; /* * These structures are used in multiple message types. (i.e. _v3_msg_channel * is used in retreiveing the channel list as well as the channel modification * message). These are also the structures for the user list and channel list */ #define V3_USER_ACCEPT_PAGES 0x00 #define V3_USER_ACCEPT_U2U 0x01 #define V3_USER_ALLOW_RECORD 0x02 #define V3_USER_ACCEPT_CHAT 0x03 #define V3_USER_GLOBAL_MUTE 0x04 #define V3_USER_CHANNEL_MUTE 0x05 #define V3_MAX_USER_SIZE 512 #define V3_MAX_CHANNEL_SIZE 512 #define V3_MAX_STRING_SIZE 512 typedef struct __v3_msg_user {/*{{{*/ uint16_t id; uint16_t channel; uint16_t bitfield; uint16_t rank_id; char *name; char *phonetic; char *comment; char *url; char *integration_text; /* * Put locally used user state and internal variables here */ uint8_t is_transmitting; uint8_t accept_pages; uint8_t accept_u2u; uint8_t accept_chat; uint8_t allow_recording; uint8_t global_mute; uint8_t channel_mute; uint8_t guest; void *next; uint16_t real_user_id; // used for phantom users } _v3_msg_user;/*}}}*/ typedef struct __v3_msg_channel {/*{{{*/ /* offset: 0 1 2 3 4 5 6 7 8 9 10 * no channel pw: PACKET: 65 6E 02 00 01 00 00 00 00 00 01 00 01 00 01 00 en.............. * with channel pw: PACKET: 65 6E 02 00 01 00 00 01 00 00 01 00 01 00 01 00 en.............. */ // byte from initial offset uint16_t id; // 0 uint16_t parent; // 2 uint8_t unknown_1; // 4 uint8_t password_protected; // 5 uint16_t unknown_2; // 6 uint16_t allow_recording; // 8 uint16_t allow_cross_channel_transmit; // 10 uint16_t allow_paging; // 12 uint16_t allow_wave_file_binds; // 14 uint16_t allow_tts_binds; // 16 uint16_t allow_u2u_transmit; // 18 uint16_t disable_guest_transmit; // 20 uint16_t disable_sound_events; // 22 uint16_t voice_mode; // 24 uint16_t transmit_time_limit; // 26 uint16_t allow_phantoms; // 28 uint16_t max_clients; // 30 uint16_t allow_guests; // 32 uint16_t inactive_exempt; // 34 uint16_t protect_mode; // 36 uint16_t transmit_rank_level; // 38 uint16_t channel_codec; // 40 uint16_t channel_format; // 42 uint16_t allow_voice_target; // 44 uint16_t allow_command_target; // 46 char *name; // length of name 48 - is variable length, so the rest of the // channel is variable offset char *phonetic; char *comment; /* * Put locally used channel state and internal variables here */ void *next; } _v3_msg_channel;/*}}}*/ typedef struct __v3_msg_rank {/*{{{*/ uint16_t id; uint16_t level; char *name; char *description; /* * Put internal variables here */ void *next; } _v3_msg_rank;/*}}}*/ typedef struct __v3_msg_account {/*{{{*/ v3_permissions perms; char *username; char *owner; char *notes; char *lock_reason; int chan_admin_count; uint16_t *chan_admin; int chan_auth_count; uint16_t *chan_auth; /* * Put internal variables here */ void *next; } _v3_msg_account;/*}}}*/ typedef _v3_msg_user v3_user; typedef _v3_msg_channel v3_channel; typedef _v3_msg_rank v3_rank; typedef _v3_msg_account v3_account; /* * This structure defines the bit number of each permission setting, the * internal name, and a name suitable for display to a user. */ struct _v3_perm_info { uint8_t bitnum; char *name; char *display_name; }; typedef struct { uint8_t key[256]; uint32_t pos; uint32_t size; #ifdef VENTRILO_ALGO_PROTOCOL int proto; #endif } ventrilo_key_ctx; typedef struct __v3_codec { uint8_t codec; uint8_t format; uint16_t pcmframesize; uint32_t rate; uint8_t quality; char name[128]; } v3_codec; extern v3_codec v3_codecs[]; typedef struct __v3_server { uint32_t ip; // The server's IP address uint16_t port; // The server's TCP port number uint16_t max_clients; // The maximum number of clients allowed uint16_t connected_clients; // The number of clients currently connected uint16_t is_licensed; // The server is licensed char *name; // The name of the server char *version; // The version of the server char *os; // The OS the server is running on char *handshake_key; // Authentication information char *handshake; // Authentication information char *motd; // Message of the day char *guest_motd; // Guest message of the day int auth_server_index; // The array index of the authentication server int evpipe[2]; // This is a pipe that libventrilo3 listens on for outbound events uint16_t codec; // The server's default codec uint16_t codec_format; // The server's default codec format ventrilo_key_ctx server_key; // The key used for decrypting messages from the server ventrilo_key_ctx client_key; // The key used for encrypting messages to the server _v3_net_message *_queue; // This queue (linked list) is used internally _v3_net_message *queue; // This queue (linked list) stores messages that need to be processed by the client struct timeval last_timestamp; // The time() of the last timestamp, a timestamp is sent every 10 seconds uint32_t recv_packet_count; // Total amount of packets received from server. uint64_t recv_byte_count; // Total amount of bytes received from server. uint32_t sent_packet_count; // Total amount of packets received from server. uint64_t sent_byte_count; // Total amount of bytes received from server. uint8_t motd_always; // Always display MOTD uint8_t per_channel_chat; // Global or Per Channel chat filter uint8_t channel_manual_sort; // Display the channels alphabetical or manual } _v3_server; /* * This structure stores the local user's information */ typedef struct __v3_luser { int id; char *name; char *password; char *phonetic; char *comment; char *integration_text; char *url; int ping; uint8_t accept_pages; uint8_t accept_u2u; uint8_t accept_chat; uint8_t allow_recording; v3_permissions perms; uint16_t channel_admin[65535]; } _v3_luser; /* * Internal functions defined here to make life easier for coding the library. * These should eventually be moved into libventrilo3.c or implemented as * external functions if required and should not be used by programs linking * the library. */ void _v3_debug(uint32_t level, const char *format, ...); char * _v3_error(const char *format, ...); void _v3_func_enter(char *func); void _v3_func_leave(char *func); _v3_net_message * _v3_recv(int block); void _v3_hash_password(uint8_t* password, uint8_t* hash); int _v3_process_message(_v3_net_message *msg); int _v3_close_connection(void); int _v3_is_connected(void); void _v3_print_user_list(void); // testing function -- will be deleted void _v3_print_channel_list(void); // testing function -- will be deleted void _v3_print_permissions(v3_permissions *perms); /* * External functions that are used by a program linking to the library */ int v3_login(char *server, char *username, char *password, char *phonetic); void v3_join_chat(void); void v3_leave_chat(void); void v3_send_chat_message(char *message); void v3_start_privchat(uint16_t userid); void v3_end_privchat(uint16_t userid); void v3_send_privchat_message(uint16_t userid, char *message); void v3_send_privchat_away(uint16_t userid); void v3_send_privchat_back(uint16_t userid); void v3_send_tts_message(char *message); void v3_send_play_wave_message(char *message); void v3_send_user_page(uint16_t user_id); void v3_logout(void); void v3_change_channel(uint16_t channel_id, char *password); void v3_admin_login(char *password); void v3_admin_logout(void); void v3_admin_boot(int type, uint16_t user_id, char *reason); void v3_admin_global_mute(uint16_t user_id); void v3_admin_channel_mute(uint16_t user_id); void v3_phantom_add(uint16_t channel_id); void v3_phantom_remove(uint16_t channel_id); void v3_force_channel_move(uint16_t id, uint16_t channel_id); void v3_userlist_open(void); void v3_userlist_close(void); void v3_userlist_remove(uint16_t account_id); void v3_userlist_update(v3_account *account); void v3_userlist_change_owner(uint16_t old_owner_id, uint16_t new_owner_id); void v3_serverprop_open(void); void v3_serverprop_close(void); void v3_serverprop_update(const v3_server_prop *prop); void v3_admin_ban_list(void); void v3_admin_ban_add(uint16_t bitmask_id, uint32_t ip_address, const char *user, const char *reason); void v3_admin_ban_remove(uint16_t bitmask_id, uint32_t ip_address); int v3_debuglevel(uint32_t level); int v3_is_loggedin(void); uint16_t v3_get_user_id(void); void v3_set_text(char *comment, char *url, char *integration_text, uint8_t silent); int v3_message_waiting(int block); uint16_t *v3_get_soundq(uint32_t *len); uint32_t v3_get_soundq_length(void); v3_event *v3_get_event(int block); int v3_get_max_clients(void); int v3_is_licensed(void); uint64_t v3_get_bytes_recv(void); uint64_t v3_get_bytes_sent(void); uint32_t v3_get_packets_recv(void); uint32_t v3_get_packets_sent(void); void v3_clear_events(void); void v3_free_event(v3_event *ev); uint32_t v3_get_codec_rate(uint16_t codec, uint16_t format); const v3_codec *v3_get_codec(uint16_t codec, uint16_t format); const v3_codec *v3_get_channel_codec(uint16_t channel_id); uint16_t v3_get_user_channel(uint16_t id); uint16_t v3_channel_requires_password(uint16_t channel_id); void v3_start_audio(uint16_t send_type); uint32_t v3_send_audio(uint16_t send_type, uint32_t rate, uint8_t *pcm, uint32_t length, uint8_t stereo); void v3_stop_audio(void); void v3_set_server_opts(uint8_t type, uint8_t value); const v3_permissions *v3_get_permissions(void); uint8_t v3_is_channel_admin(uint16_t channel_id); void v3_channel_update(v3_channel *channel, const char *password); void v3_channel_remove(uint16_t channel_id); int v3_max_pcm_frames(const v3_codec *codec); uint32_t v3_pcmlength_for_rate(uint32_t rate); // User list functions int v3_user_count(void); void v3_free_user(v3_user *user); v3_user *v3_get_user(uint16_t id); // Channel list functions int v3_channel_count(void); void v3_free_channel(v3_channel *channel); v3_channel *v3_get_channel(uint16_t id); int v3_get_channel_sort(uint16_t id_left, uint16_t id_right); uint16_t v3_get_channel_id(const char *path); char * v3_get_channel_path(uint16_t channel_id); // Rank list functions void v3_ranklist_open(void); void v3_ranklist_close(void); v3_rank *v3_get_rank(uint16_t id); void v3_rank_update(v3_rank *rank); void v3_rank_remove(uint16_t rankid); void v3_free_rank(v3_rank *rank); // Account list functions v3_account *v3_get_account(uint16_t id); int v3_account_count(void); void v3_free_account(v3_account *account); // Audio DSP functions void v3_set_volume_master(int level); void v3_set_volume_user(uint16_t id, int level); void v3_set_volume_xmit(int level); void v3_set_volume_luser(int level); uint8_t v3_get_volume_user(uint16_t id); uint8_t v3_get_volume_luser(void); // Recording API functions #define V3_VRF_DATA_NULL 0x00 #define V3_VRF_DATA_AUDIO 0x01 #define V3_VRF_DATA_TEXT 0x02 typedef struct v3_vrf_data { uint32_t size; int8_t codec; int8_t codecformat; char platform[64]; char version[64]; char comment[8192]; char url[1024]; char copyright[1024]; uint32_t id; uint32_t time; uint32_t duration; char username[32]; int type; void *data; char *text; uint32_t length; uint32_t rate; uint8_t channels; void *_audio; void *_decoder; } v3_vrf_data; void *v3_vrf_init(const char *filename); void v3_vrf_destroy(void *vrfh); void v3_vrf_data_init(v3_vrf_data *vrfd); void v3_vrf_data_destroy(v3_vrf_data *vrfd); uint32_t v3_vrf_get_count(void *vrfh); int v3_vrf_get_info(void *vrfh, v3_vrf_data *vrfd); int v3_vrf_get_segment(void *vrfh, uint32_t id, v3_vrf_data *vrfd); int v3_vrf_get_audio(void *vrfh, uint32_t id, v3_vrf_data *vrfd); int v3_vrf_put_info(void *vrfh, const v3_vrf_data *vrfd); int v3_vrf_record_start(const char *filename); void v3_vrf_record_stop(void); #endif // _VENTRILO3_H