Advertisement
Jailout2000

BinaryChat API (BCP.h)

Jun 25th, 2011
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 31.61 KB | None | 0 0
  1. #ifndef BCP_H
  2. #define BCP_H
  3.  
  4. // BCP.h - Copyright (C) 2003 Skywing
  5. // Plugin revision 6 is NOT FINALIZED.  The information relating to revision 6 in
  6. // this file is PRELIMINARY and LIKELY TO CHANGE.
  7.  
  8. // For the Encryption, PubKey, and DesKey classes, see Adron's Encryption Library.
  9. // This can be found at http://www.adron.org/Encryption/
  10. // These members should be set to zero if they are not supported for any reason.
  11.  
  12. // All BinaryChat plugins must export the function SetInterfaceInformation, which
  13. // must conform to the PluginInitProc prototype.
  14.  
  15. // All extended (multibot-aware) BinaryChat plugins must export the function
  16. // SetInterfaceInformationEx, which must conform to the PluginInitExProc prototype.
  17.  
  18. // All BinaryChat plugins can assume that they are both always called from only one
  19. // thread, and that their caller runs an alertable message loop which properly
  20. // calls IsDialogMessage for dialogs.
  21.  
  22. // Additionally, any program supporting the plugin interface should initialize the
  23. // common controls, RichEdit 2.00, and Winsock 2.02.
  24.  
  25. #pragma once
  26.  
  27. #include <windows.h>
  28. #include <time.h>
  29.  
  30. // BinaryChat Plugin API
  31.  
  32. #define NUM_INTERFACES 3
  33.  
  34. namespace PluginAPI {
  35.     enum {
  36.         Connection_BNCS = 0,
  37.         Connection_MCP,
  38.         Connection_GS
  39.     };
  40.  
  41.     enum {
  42.         Connection_Closed = 0,
  43.         Connection_Opened,
  44.     };
  45.  
  46.     enum {
  47.         Main_Window = 0,
  48.         Channel_List,
  49.         Channel_Name,
  50.         User_Input,
  51.         Chat_Output,
  52.         Account_Manager,
  53.         Realm_Manager,
  54.         Download_Manager,
  55.         News_Window,
  56.         Filters_Manager,
  57.         Channels_Manager,
  58.     };
  59.  
  60.     enum {
  61.         Main_Window_Menu = 0,
  62.         Channel_User_Popup_Menu, // NOTE: this is actually the first submenu, not the parent menu
  63.         // v6
  64.         Tray_Menu
  65.     };
  66.  
  67.     // v5
  68.     enum {
  69.         Output_Normal,
  70.         Output_Timestamp
  71.     };
  72.  
  73.     enum {
  74.         Plugin_Activate,
  75.         Plugin_Deactivate
  76.     };
  77.  
  78.     enum {
  79.         PBCE_From_Telnet        =       0x00000001
  80.     };
  81.  
  82.     enum {
  83.         QCE_Fix_D2_Command      =       0x00000001,
  84.         QCE_Process_Modifiers   =       0x00000002,
  85.         QCE_Reset_Away_Idle     =       0x00000004
  86.     };
  87.  
  88.     enum {
  89.         Control_Start = 0,
  90.         Control_Stop,
  91.         Control_Hide,
  92.         Control_Show,
  93.         Control_Create_Profile,
  94.         Control_Exit,
  95.         Control_Load_Library,
  96.         Control_Free_Library,
  97.         Control_Get_Service_Status_Handle,
  98.         Control_Get_Service_Status
  99.     };
  100.  
  101.     enum {
  102.         Tray_Notify_Window = 0
  103.     };
  104. };
  105.  
  106. // Color constants
  107.  
  108. namespace BotOutput {
  109.     enum {              // R   , G   , B
  110.         WHITE = 0,      // 0xff, 0xff, 0xff
  111.         GRAY = 1,       // 0x7f, 0x7f, 0x7f
  112.         BLUE = 2,       // 0x00, 0xff, 0xff
  113.         GREEN = 3,      // 0x00, 0xff, 0x00
  114.         RED = 4,        // 0xff, 0x00, 0x00
  115.         YELLOW = 5,     // 0xff, 0xff, 0x00
  116.         PURPLE = 6,     // 0xff, 0x00, 0xff
  117.         BLUEGREEN = 7,      // 0x00, 0x7f, 0x7f
  118.         MIDBLUE = 8,        // 0x00, 0x00, 0xff
  119.         DARKBLUE = 9,       // 0x00, 0x00, 0x7f
  120.         DARKGREEN = 10,     // 0x10, 0xaf, 0x10
  121.         DARKYELLOW = 11,    // 0x7f, 0x7f, 0x00
  122.         DARKRED = 12,       // 0x7f, 0x00, 0x00
  123.         DARKPURPLE = 13,    // 0x7f, 0x00, 0x7f
  124.         LIGHTBLUE = 14      // 0x00, 0x6f, 0xff
  125.     };
  126. };
  127.  
  128. struct PluginInformation;
  129. typedef struct PluginInformation5 PluginInformationCurrent;
  130. struct StateInformation;
  131. class BotNetConnectionState;
  132. struct PluginInformationEx;
  133.  
  134. typedef struct { int unused; } *HBINARYCHAT, **PHBINARYCHAT, **LPHBINARYCHAT;
  135. typedef struct { int unused; } *HINTERFACELIST, **PHINTERFACELIST, **LPHINTERFACELIST;
  136.  
  137.  
  138. // User functions
  139. typedef BOOL (WINAPI * PluginInitProc)(PluginInformation * lpInterfaceInfo);
  140. typedef BOOL (WINAPI * MessageHookProc)(DWORD dwConnectionId, BYTE MessageId,
  141.                                         LPCVOID lpMessageData, DWORD nMessageSize,
  142.                                         LPARAM lParam);
  143. typedef BOOL (WINAPI * EnumChannelProc)(LPCSTR lpszUniqueName, LPCSTR lpszStatstring,
  144.                                         DWORD dwFlags, DWORD dwPing, BOOL bInvisible,
  145.                                         DWORD dwAccountNumber, DWORD dwRegAuthority,
  146.                                         LPARAM lParam);
  147. typedef BOOL (WINAPI * ConnectionHookProc)(DWORD dwConnectionId, DWORD dwEventCode,
  148.                                            DWORDLONG qwPlatformId, LPARAM lParam);
  149. typedef DWORD (WINAPI * PluginTimerProc)(DWORD dwTimeDelay, LPARAM lParam);
  150. typedef BOOL (WINAPI * CommandHookProc)(LPCSTR lpszMessage, LPCSTR lpszSendingUser,
  151.                                         BOOL bFromTelnet, LPARAM lParam);
  152. typedef BOOL (WINAPI * EventHookProc)(LPARAM lParam);
  153. typedef BOOL (WINAPI * EnumFilterProc)(LPCSTR lpszFilter, LPARAM lParam);
  154. typedef BOOL (WINAPI * EnumPluginsProc)(HINSTANCE hPlugin, LPARAM lParam);
  155. // v5
  156. typedef BOOL (WINAPI * PluginDestroyProc)(LPARAM lParam);
  157. typedef BOOL (WINAPI * OutputHookProc)(DWORD dwReason, BYTE Color, LPCSTR lpszMessage, LPARAM lParam);
  158. typedef VOID (WINAPI * DeferredProcedureCallProc)(LPARAM lParam);
  159. // v6
  160. typedef BOOL (WINAPI * MessageSendHookProc)(DWORD dwConnectionId, BYTE MessageId,
  161.                                             LPVOID lpMessageData, DWORD nMessageSize,
  162.                                             LPARAM lParam);
  163. typedef BOOL (WINAPI * TextModifierSendHookProc)(DWORD dwConnectionId, LPCSTR lpszMessageText,
  164.                                                  LPARAM lParam);
  165. typedef BOOL (WINAPI * TextModifierReceiveHookProc)(DWORD dwConnectionId, LPSTR lpszMessageText,
  166.                                                     LPARAM lParam);
  167.  
  168. // Multibot support (bcpx) user functions
  169. typedef BOOL (WINAPI * PluginInitExProc)(PluginInformationEx * lpInterfaceInfo);
  170. typedef BOOL (WINAPI * PluginDestroyExProc)(LPARAM lParam);
  171. typedef BOOL (WINAPI * PluginControlProc)(DWORD dwOperation, PluginInformation * lpInterfaceInfo,
  172.                                           HBINARYCHAT hBinaryChat, LPARAM lParam);
  173. typedef BOOL (WINAPI * EnumInstancesProc)(HBINARYCHAT hBinaryChat, LPARAM lParam);
  174. typedef BOOL (WINAPI * EnumProfilesProc)(LPCSTR lpszProfileName, LPARAM lParam);
  175.  
  176. // APIs
  177. typedef BOOL (WINAPI * ClearMessageProc)(BYTE MessageId);
  178. typedef BOOL (WINAPI * IsMessageSetProc)(BYTE MessageId);
  179. typedef BOOL (WINAPI * SetMessageProc)(BYTE MessageId);
  180. typedef BOOL (WINAPI * QueueMessageProc)(BYTE MessageId, LPCVOID lpMessageData,
  181.                                          DWORD nMessageSize);
  182. typedef BOOL (WINAPI * QueueChatMessageProc)(LPSTR lpszChatMessage, BOOL bFixD2Command);
  183. typedef BOOL (WINAPI * QueryStateInformationProc)(StateInformation * lpStateInfo);
  184. typedef BOOL (WINAPI * QueryChannelInformationProc)(EnumChannelProc lpCallback,
  185.                                                     LPARAM lParam);
  186. typedef BOOL (WINAPI * CloseConnectionProc)(DWORD dwConnectionId);
  187. typedef BOOL (WINAPI * SendConnectionMessageProc)(DWORD dwConnectionId, BYTE MessageId,
  188.                                                   LPCVOID lpMessageData, DWORD nMessageSize);
  189. typedef BOOL (WINAPI * SetOutputColorProc)(BYTE ColorId);
  190. typedef BOOL (WINAPI * WriteOutputTimestampProc)(void);
  191. typedef BOOL (WINAPI * WriteOutputStringProc)(LPCSTR lpszString);
  192. typedef BOOL (WINAPI * ProcessBotCommandProc)(LPCSTR lpszCommand);
  193. typedef LPCSTR (WINAPI * GetRegistryPathProc)(void);
  194. typedef BOOL (WINAPI * ResetAwayIdleProc)(void);
  195. typedef HWND (WINAPI * GetWindowProc)(DWORD dwWindowId);
  196. typedef BOOL (WINAPI * IsServiceProc)(void);
  197. typedef HMENU (WINAPI * GetMenuProc)(DWORD dwMenuId);
  198. typedef BOOL (WINAPI * IsUserFilteredProc)(LPCSTR lpszUser);
  199. typedef BOOL (WINAPI * IsMessageFilteredProc)(LPCSTR lpszMessage);
  200. typedef BOOL (WINAPI * EnumUserFiltersProc)(EnumFilterProc lpCallback, LPARAM lParam);
  201. typedef BOOL (WINAPI * EnumMessageFiltersProc)(EnumFilterProc lpCallback, LPARAM lParam);
  202. typedef BOOL (WINAPI * AddUserFilterProc)(LPCSTR lpszFilter, BOOL bSaveFilters);
  203. typedef BOOL (WINAPI * AddMessageFilterProc)(LPCSTR lpszMessageFilter, BOOL bSaveFilters);
  204. typedef BOOL (WINAPI * RemoveUserFilterProc)(LPCSTR lpszFilter, BOOL bSaveFilters);
  205. typedef BOOL (WINAPI * RemoveMessageFilterProc)(LPCSTR lpszFilter, BOOL bSaveFilters);
  206. typedef BOOL (WINAPIV * NotifyMsgProc)(BYTE bColor, LPCSTR lpszUser, LPCSTR lpszMessageFormat, ...);
  207. typedef BOOL (WINAPI * EnumLoadedPluginsProc)(EnumPluginsProc lpCallback, LPARAM lParam);
  208. // v5
  209. typedef BOOL (WINAPI * ProcessBotCommandExProc)(LPCSTR lpszMessage, DWORD dwFlags,
  210.                                                 LPCSTR lpszRemoteUser);
  211. typedef BOOL (WINAPI * QueueChatMessageExProc)(LPSTR lpszMessage, DWORD dwFlags);
  212. typedef BOOL (WINAPI * QueueDPCProc)(DeferredProcedureCallProc DPC, LPARAM lParam);
  213. // v6
  214. // ...
  215.  
  216. // Multibot support (bcpx) APIs
  217. typedef HBINARYCHAT (WINAPI * GetCurrentBinaryChatProc)(void);
  218. typedef BOOL (WINAPI * SetCurrentBinaryChatProc)(HBINARYCHAT hBinaryChat);
  219. typedef BOOL (WINAPI * EnumBinaryChatsProc)(EnumInstancesProc lpCallback, LPARAM lParam);
  220. typedef BOOL (WINAPI * EnumBinaryChatProfilesProc)(EnumProfilesProc lpCallback, LPARAM lParam);
  221. typedef LRESULT (WINAPI * ControlBinaryChatProc)(HBINARYCHAT hBinaryChat, DWORD dwControlCode, WPARAM wParam, LPARAM lParam);
  222. typedef LPCSTR (WINAPI * GetBinaryChatProfileNameProc)(HBINARYCHAT hBinaryChat);
  223. typedef LPCSTR (WINAPI * GetProfileRegistryPathProc)(void);
  224. typedef HWND (WINAPI * ExGetWindowProc)(DWORD dwWindowId);
  225. typedef HBINARYCHAT (WINAPI * PluginInformationToBinaryChatProc)(PluginInformationCurrent * lpPluginInformation, HINTERFACELIST hInterfaceList);
  226. typedef PluginInformationCurrent * (WINAPI * BinaryChatToPluginInformationProc)(HBINARYCHAT hBinaryChat, HINTERFACELIST hInterfaceList);
  227. typedef DWORD (WINAPI * GetBotIdProc)(HBINARYCHAT hBinaryChat);
  228. typedef HBINARYCHAT (WINAPI * GetBinaryChatProc)(DWORD dwBotId);
  229.  
  230. struct PluginInformation {
  231.     DWORD dwSize;
  232.  
  233.     ClearMessageProc PNetClearMessage;
  234.     IsMessageSetProc PNetIsMessageSet;
  235.     SetMessageProc PNetSetMessage;
  236.     QueueMessageProc PNetQueueMessage;
  237.     QueueChatMessageProc PNetQueueChatMessage;
  238.     QueryStateInformationProc PSysQueryStateInformation;
  239.     QueryChannelInformationProc PSysQueryChannelInformation;
  240.     CloseConnectionProc PNetCloseConnection;
  241.     SendConnectionMessageProc PNetSendConnectionMessage;
  242.     SetOutputColorProc PUISetColor;
  243.     WriteOutputTimestampProc PUIWriteTimestamp;
  244.     WriteOutputStringProc PUIWriteString;
  245.  
  246.     HINSTANCE hBotNetClient;
  247.     BotNetConnectionState * lpBotNetConnection;
  248.  
  249.     MessageHookProc MessageHook;                            // non-const
  250.     LPARAM MessageHookParam;                                // non-const
  251.  
  252.     ConnectionHookProc ConnectionHook;                      // non-const
  253.     LPARAM ConnectionHookParam;                             // non-const
  254.  
  255.     PluginTimerProc PluginTimer;                            // non-const
  256.     LPARAM PluginTimerParam;                                // non-const
  257.  
  258.     CommandHookProc CommandHook;                            // non-const
  259.     LPARAM CommandHookParam;                                // non-const
  260.  
  261.     HINSTANCE hPlugin;
  262.  
  263.     EventHookProc EventHook;                                // non-const
  264.     LPARAM EventHookParam;                                  // non-const
  265.     HANDLE hPluginEvent;
  266. };
  267.  
  268. struct PluginInformation2 : public PluginInformation {
  269.     ProcessBotCommandProc PSysProcessBotCommand;
  270. };
  271.  
  272. struct PluginInformation3 : public PluginInformation2 {
  273.     GetRegistryPathProc PRegGetRegistryPath;
  274.     ResetAwayIdleProc PNetResetAwayIdle;
  275.     GetWindowProc PUIGetWindow;
  276.     IsServiceProc PSysIsService;
  277.     GetMenuProc PUIGetMenu;
  278. };
  279.  
  280. struct PluginInformation4 : public PluginInformation3 { /* These all still need to be implemented in BinaryChatAPI.cpp! */
  281.     IsUserFilteredProc PFltIsUserFiltered;
  282.     IsMessageFilteredProc PFltIsMessageFiltered;
  283.     EnumUserFiltersProc PFltEnumUserFilters;
  284.     EnumMessageFiltersProc PFltEnumMessageFilters;
  285.     AddUserFilterProc PFltAddUserFilter;
  286.     AddMessageFilterProc PFltAddMessageFilter;
  287.     RemoveUserFilterProc PFltRemoveUserFilter;
  288.     RemoveMessageFilterProc PFltRemoveMessageFilter;
  289.     NotifyMsgProc PUINotifyMsg;
  290.     EnumLoadedPluginsProc PSysEnumLoadedPlugins;
  291. };
  292.  
  293. struct PluginInformation5 : public PluginInformation4 {
  294.     class Encryption* EncryptionInstance;
  295.     class PubKey** RSATarget;
  296.     class DesKey** DESTarget;
  297.  
  298.     ProcessBotCommandExProc PSysProcessBotCommandEx;
  299.     QueueChatMessageExProc PNetQueueChatMessageEx;
  300.     QueueDPCProc PSysQueueDPC;
  301.  
  302.     PluginDestroyProc PluginDestroy;                        // non-const
  303.     LPARAM PluginDestroyParam;                              // non-const
  304.  
  305.     OutputHookProc OutputHook;                              // non-const
  306.     LPARAM OutputHookParam;                                 // non-const
  307. };
  308.  
  309. // PRELIMINARY
  310. struct PluginInformation6 : public PluginInformation5 {
  311.     // ...
  312.  
  313.     MessageSendHookProc MessageSendHook;                    // non-const
  314.     LPARAM MessageSendHookParam;                            // non-const
  315.  
  316.     TextModifierSendHookProc TextModifierSendHook;          // non-const
  317.     LPARAM TextModifierSendHookParam;                       // non-const
  318.  
  319.     TextModifierReceiveHookProc TextModifierReceiveHook;    // non-const
  320.     LPARAM TextModifierReceiveHookParam;                    // non-const
  321.  
  322.     // add BotNetXHook to replace old-style method of interacting with BotNetClient so we can unload
  323. };
  324.  
  325. struct StateInformation {
  326.     DWORD dwSize;
  327.  
  328.     char szChannelName[256];
  329.     DWORD dwChannelFlags;
  330.  
  331.     char szUniqueName[256];
  332.     char szAccountName[256];
  333.     char szStatstring[256];
  334.  
  335.     DWORD dwConnectionState[NUM_INTERFACES];
  336. };
  337.  
  338. struct PluginInformationEx {
  339.     DWORD dwSize;
  340.     DWORD dwPluginInformationSize;                              // Highest PluginInformation supported
  341.  
  342.     GetCurrentBinaryChatProc PSysGetCurrentBinaryChat;
  343.     SetCurrentBinaryChatProc PSysSetCurrentBinaryChat;
  344.     EnumBinaryChatsProc PSysEnumBinaryChats;
  345.     EnumBinaryChatProfilesProc PSysEnumBinaryChatProfiles;
  346.     EnumLoadedPluginsProc PSysEnumExPlugins;
  347.     ControlBinaryChatProc PSysControlBinaryChat;
  348.     GetBinaryChatProfileNameProc PSysGetBinaryChatProfileName;
  349.     GetProfileRegistryPathProc PRegGetProfileRegistryPath;
  350.     ExGetWindowProc PUIGetExWindow;
  351.     PluginInformationToBinaryChatProc PSysPluginInformationToBinaryChat;
  352.     BinaryChatToPluginInformationProc PSysBinaryChatToPluginInformation;
  353.     GetBotIdProc PSysGetBotId;
  354.     GetBinaryChatProc PSysGetBinaryChat;
  355.  
  356.     PluginControlProc PluginControl;
  357.     LPARAM PluginControlParam;
  358.  
  359.     PluginDestroyExProc PluginDestroyEx;
  360.     LPARAM PluginDestroyExParam;
  361.  
  362.     HINSTANCE hPlugin;
  363.     HINTERFACELIST hInterfaceList;                              // Reserved for internal use
  364. };
  365.  
  366. // End BinaryChat Plugin API
  367.  
  368. // BotNetClient API
  369.  
  370. // Virtual base-class for buffering classes
  371. class VirtualBuffer {
  372. public:
  373.     virtual ~VirtualBuffer(void) { }
  374.     virtual void insert(unsigned long data) = 0;
  375.     virtual void insert(const char *data) = 0;
  376.     virtual void insert(const void *data, int size) = 0;
  377.     virtual void insert(const class LadderQuery &query) = 0;
  378.     virtual void insert(const class LadderFind &find) = 0;
  379.     virtual void insertbyte(unsigned char data) = 0;
  380.     virtual void insertshort(unsigned short data) = 0;
  381.     virtual unsigned long extract(void) = 0;
  382.     virtual char *extract(char *databuf) = 0;
  383.     virtual unsigned char extractbyte(void) = 0;
  384.     virtual unsigned short extractshort(void) = 0;
  385.     virtual void *extract(void *databuf, int size) = 0;
  386.     virtual class LadderQueryResult &extract(class LadderQueryResult &query) = 0;
  387.     virtual unsigned short extractlen(void) = 0;
  388.     virtual short extractepos(void) = 0;
  389.     virtual short extractipos(void) = 0;
  390.     virtual void clear(void) = 0;
  391.     virtual void resetextraction(void) = 0;
  392.     virtual void resetinsertion(void) = 0;
  393.     virtual void reset(void) = 0;
  394.     virtual operator char *(void) = 0;
  395.     virtual operator int(void) = 0;
  396.     virtual operator +=(int size) = 0;
  397.     virtual operator -=(int size) = 0;
  398. };
  399.  
  400. union BotAccessFlags {
  401.     struct {
  402.         unsigned Read : 1;
  403.         unsigned Write : 1;
  404.         unsigned Admin : 1;
  405.         unsigned Restricted : 1;
  406.         unsigned Reserved : 28;
  407.     };
  408.     DWORD dwFlags;
  409. };
  410.  
  411.  
  412. struct BotNetUserInfo {
  413.     DWORD dwServer, dwId;
  414.     bool bCycle;
  415.     char *pszName, *pszChannel;
  416.     char szAccountName[16];
  417.     BotAccessFlags AccessFlags;
  418.     BotNetUserInfo(const char *_pszName, const char *_pszChannel) { pszName = newstr(_pszName); pszChannel = newstr(_pszChannel); }
  419.     virtual ~BotNetUserInfo() { if(pszName) delete [] pszName; if(pszChannel) delete [] pszChannel; }
  420. };
  421.  
  422. struct BotNetUserInfo2 : public BotNetUserInfo {
  423.     char* pszDatabase;
  424.     BotNetUserInfo2(const char *_pszName, const char *_pszChannel, const char *_pszDatabase) : BotNetUserInfo(_pszName, _pszChannel) { pszDatabase = newstr(_pszDatabase); }
  425.     virtual ~BotNetUserInfo2() { if(pszDatabase) delete [] pszDatabase; }
  426. };
  427.  
  428. struct BotNetUserInfoEx : public BotNetUserInfo { /* for Admin queries */
  429.     DWORD dwIP, dwCycleUser;
  430.     char *pszDatabase, *pszPreCycleChannel;
  431.     BotNetUserInfoEx(const char *_pszName, const char *_pszChannel, const char *_pszDatabase, const char *_pszPreCycleChannel) : BotNetUserInfo(_pszName, _pszChannel) { pszDatabase = newstr(_pszDatabase); pszPreCycleChannel = newstr(_pszPreCycleChannel); }
  432.     virtual ~BotNetUserInfoEx() { if(pszDatabase) delete [] pszDatabase; if(pszPreCycleChannel) delete [] pszPreCycleChannel; }
  433. };
  434.  
  435. typedef BotNetUserInfo2 BotNetUserInfoCurrent;
  436.  
  437. struct PrivilegeMask {
  438.     UserAttributes Attributes;
  439.     char *pszMask;
  440.     PrivilegeMask() { pszMask = 0; Attributes.dwFlags = 0; }
  441.     PrivilegeMask(const char *_pszMask, UserAttributes _Attributes) { pszMask = newstr(_pszMask);  Attributes.Replace(_Attributes, true); }
  442.     ~PrivilegeMask() { if(pszMask) delete [] pszMask; }
  443.     PrivilegeMask& operator=(const PrivilegeMask& other) { if(pszMask) delete [] pszMask; pszMask = newstr(other.pszMask); Attributes.dwFlags = other.Attributes.dwFlags; return *this; }
  444. };
  445.  
  446. class BotNetConnectionState {
  447. public:
  448.     typedef DWORD (__cdecl MessageProcessorProc)(const char *pszMessage, const char *pszSender,
  449.         ListEx <PrivilegeMask *>& Database, ListEx <BotNetUserInfo *>& BotNetUsers, void *Param);
  450.     typedef DWORD (__cdecl DatabaseChangeProc)(DWORD dwFlags, PrivilegeMask *pUser,
  451.         UserAttributes OriginalAttributes, ListEx <PrivilegeMask *>& Database,
  452.         ListEx <BotNetUserInfo *>& BotNetUsers, void *Param);
  453.     typedef void (__cdecl BotNetUserUpdateProc)(DWORD dwFlags, BotNetUserInfo *pUser,
  454.         void *Param);
  455.     typedef DWORD (__cdecl BotNetChatProc)(DWORD dwMessageType, DWORD dwMessageAction,
  456.         const BotNetUserInfo *pSender, const char *pszMessage, void *Param);
  457.     typedef DWORD (__cdecl AccountStatusProc)(DWORD dwEvent, BotNetUserInfo *pUser,
  458.         const char *pszNewAccountName, void *Param);
  459.     typedef DWORD (__cdecl AdminCommandProcessorProc)(DWORD dwEvent, BotNetUserInfoEx *pUser,
  460.         DWORD dwBannedAddresses[128], void *Param);
  461.  
  462.     enum { // BotNet commands and BotNet chat
  463.         Message_Database                =   0x00000000,
  464.         Message_Broadcast               =   0x00000001,
  465.         Message_Narrow                  =   0x00000002 // Whisper for BotNet chat
  466.     };
  467.     enum { // BotNet chat actions
  468.         Action_Talk                     =   0x00000000,
  469.         Action_Emote                    =   0x00000001
  470.     };
  471.     enum {
  472.         Dispatch_No_Error               =   0x00000000,
  473.         Dispatch_SuccessfulConnect      =   0x00000001,
  474.         Dispatch_FailedConnect          =   0x00000002,
  475.         Dispatch_ReceiveError           =   0x00000004,
  476.         Dispatch_Disconnected           =   0x00000008,
  477.         Dispatch_Data                   =   0x00000010,
  478.         Dispatch_CycleStarting          =   0x00000020,
  479.         Dispatch_MessageTooLarge        =   0x00000040,
  480.         Dispatch_BadProtocolVersion     =   0x00000080,
  481.         Dispatch_UnknownPacket          =   0x00000100,
  482.         Dispatch_UnknownDatabaseCommand =   0x00000200,
  483.         Dispatch_UnknownChannel         =   0x00000400,
  484.         Dispatch_InvalidUser            =   0x00000800,
  485.         Dispatch_OldClientVersion       =   0x00001000,
  486.         Dispatch_UnknownAccountStatus   =   0x00002000,
  487.         Dispatch_UnknownAdminStatus     =   0x00004000,
  488.         Dispatch_UnknownDatabaseStatus  =   0x00008000
  489.     };
  490.     enum {
  491.         BotNet_Port                     =   0x5555  /* 21845 */
  492.     };
  493.     enum {
  494.         Current_Protocol_Version        =   0x01
  495.     };
  496.     enum {
  497.         Database_Create_New_Entry,
  498.         Database_Modify_Existing_Entry,
  499.         Database_Delete_Existing_Entry,
  500.         Database_Enumerated_Entry
  501.     };
  502.     enum {
  503.         BotNetUsers_User_Join,
  504.         BotNetUsers_User_Update,
  505.         BotNetUsers_User_Leave,
  506.         BotNetUsers_Enumerated_Entry
  507.     };
  508.     enum {
  509.         AccountStatus_Logon_Failed,
  510.         AccountStatus_Logon_Succeeded,
  511.         AccountStatus_ChangePassword_Failed,
  512.         AccountStatus_ChangePassword_Succeeded,
  513.         AccountStatus_Create_Failed,
  514.         AccountStatus_Create_Succeeded,
  515.         AccountStatus_Name_Change
  516.     };
  517.     enum {
  518.         Admin_Kick_Failed,
  519.         Admin_Kick_Succeeded,
  520.         Admin_Ban_Failed,
  521.         Admin_Ban_Succeeded,
  522.         Admin_Query_User_Failed,
  523.         Admin_User_Information,
  524.         Admin_Ban_List,
  525.         Admin_Unban_Failed,
  526.         Admin_Unban_Succeeded,
  527.         Admin_Privileges_Enabled
  528.     };
  529.     enum {
  530.         DBPassword_Read                 =   0x00,
  531.         DBPassword_Write                =   0x01,
  532.         DBPassword_Restricted           =   0x02
  533.     };
  534.     enum {
  535.         Account_Logon                   =   0x00,
  536.         Account_Change_Password         =   0x01,
  537.         Account_Create_Account          =   0x02
  538.     };
  539.     enum {
  540.         Server_Version_Basic            =   0x00000001,
  541.         Server_Version_Enhanced         =   0x00000002, /* Admin & Account support */
  542.         Server_Version_DBInUserInfo     =   0x00000003, /* Database in userinfo */
  543.         Server_Version_DBExtensions     =   0x00000004  /* Ability to toggle DB change negation server-side for
  544.                                                         changes made by users with insufficient access */
  545.     };
  546.     enum {
  547.         Account_Support                 =   0x00000001,
  548.         Admin_Support                   =   0x00000002,
  549.         DBEcho_Toggle                   =   0x00000003,
  550.         DBPrivilegeNotify               =   0x00000004,
  551.         DBInUserInfo                    =   0x00000005
  552.     };
  553.     enum {
  554.         DB_Privilege_None               =   0x00000000,
  555.         DB_Privilege_Readonly           =   0x00000001,
  556.         DB_Privilege_Restricted         =   0x00000002,
  557.         DB_Privilege_Write              =   0x00000004
  558.     };
  559.  
  560.     BotNetConnectionState(HANDLE _hBotNetData/*, BotOutput *_Output, queuebuf *_packetqueue,
  561.                           addqueueproc *_addqueue*/);
  562.     ~BotNetConnectionState();
  563.     void Connect(void);
  564.     void Disconnect(void);
  565.     void NotifyBNCSDisconnect(void);
  566.     void NotifyIdle(void);
  567.     bool IsConnected(void) { return State >= CONNECTED; }
  568.     bool IsDisconnected(void) { return State == DISCONNECTED; }
  569.     bool IsLoggedOn(void) { return State == LOGGEDON; }
  570.     bool IsConnecting(void) { return State == CONNECTING; }
  571.     bool IsCyclingDone(void);
  572.     bool HasAdminPrivileges(void) { return IsAdmin; }
  573.     bool IsFeaturePresent(DWORD dwFeature);
  574.     bool IsNegatingEntries(void) { return IsNegateEnabled; }
  575.     bool CanWriteToDatabase(void) { return !!(GetDatabaseAccess() & DB_Privilege_Write); }
  576.     time_t GetCycleEndTime(void) { return CycleEnd; }
  577.     time_t GetNextIdleTime(void) { return NextIdleTime; }
  578.     int GetBotNetUserCount(void) { return BotNetUsers.get_count(); }
  579.     int GetPrivilegeMaskCount(void) { return Database.get_count(); }
  580.     const char *GetPreCycleChannel(void) { if(pszPreCycleChannel) return pszPreCycleChannel; else return pszChannel; }
  581.     DWORD GetConnectError(void) { return dwConnectError; }
  582.     DWORD GetServerVersion(void) { return dwServerVersion; }
  583.     DWORD GetSelfId(void) { return SelfId; }
  584.     void FlushBotNetBuffers(bool bRemove);
  585.     void UpdateName(const char *_pszUniqueName);
  586.     void UpdateChannel(const char *_pszChannel);
  587.     void UpdateServer(DWORD _dwBattleNetServer);
  588.     void UpdatePassword(const char *_pszBotNetServerPassword);
  589.     void UpdateDatabase(const char *_pszBotNetDatabase);
  590.     void UpdateDatabasePassword(const char *_pszBotNetDatabasePassword);
  591.     void UpdateBotNetServer(DWORD _dwBotNetServer);
  592.     void UpdateStats(const char *_pszUniqueName, const char *_pszChannel, DWORD _dwBotNetServer,
  593.         DWORD _dwBattleNetServer, const char *_pszBotNetServerPassword,
  594.         const char *_pszBotNetDatabase, const char *_pszBotNetDatabasePassword);
  595.     void UpdateAccountInformation(const char *_pszAccountName, const char *_pszAccountPassword);
  596.     void ChangeDatabasePassword(DWORD PassId, const char* NewDBPass);
  597.     void SendBotNetMessage(const char *pszMessage, int Type = Message_Database, DWORD Id = 0);
  598.     void SendBotNetChatMessage(const char *pszMessage, int Type = Message_Database, int Action = Action_Talk, DWORD Id = 0);
  599.     void ChangeAccountPassword(const char *pszName, const char *pszOldPassword, const char *pszNewPassword);
  600.     void ModifyDatabaseMask(const PrivilegeMask * lpMask) { SendDBModify(lpMask); }
  601.     //void ModifyDatabaseMask(LPCSTR lpszMask, UserAttributes Attributes) { PrivilegeMask Temp(lpszMask, Attributes); SendDBModify(&Temp); }
  602.     void DeleteDatabaseMask(const PrivilegeMask * lpMask) { SendDBDelete(lpMask); }
  603.     //void DeleteDatabaseMask(LPCSTR lpszMask, UserAttributes Attributes) { PrivilegeMask Temp(lpszMask, Attributes); SendDBModify(&Temp); }
  604.     void KickUser(DWORD dwUserId);
  605.     void BanUser(DWORD dwUserId);
  606.     void UnbanIP(DWORD dwBannedIPAddress);
  607.     void QueryUser(DWORD dwUserId);
  608.     void QueryBans(void);
  609.     void SetNegateMode(bool bNegateUnderprivileged) { bPreferredNegateMode = bNegateUnderprivileged; }
  610.     DWORD GetDatabaseAccess(void) { return dwDatabaseAccess; }
  611.  
  612.     MessageProcessorProc *SetMessageProcessorCallback(MessageProcessorProc *pNewCallback, void *Param) { MessageProcessorProc *pPrev = pMessageProcessor; pMessageProcessor = pNewCallback; MessageProcessorParam = Param; return pPrev; }
  613.     DatabaseChangeProc *SetDatabaseChangeCallback(DatabaseChangeProc *pNewCallback, void *Param) { DatabaseChangeProc *pPrev = pDBProcessor; pDBProcessor = pNewCallback; DBProcessorParam = Param; return pPrev; }
  614.     BotNetUserUpdateProc *SetBotNetUserChangeCallback(BotNetUserUpdateProc *pNewCallback, void *Param) { BotNetUserUpdateProc *pPrev = pBNUProcessor; pBNUProcessor = pNewCallback; BNUProcessorParam = Param; return pPrev; }
  615.     BotNetChatProc *SetBotNetChatCallback(BotNetChatProc *pNewCallback, void *Param) { BotNetChatProc *pPrev = pBNCProcessor; pBNCProcessor = pNewCallback; BNCProcessorParam = Param; return pPrev; }
  616.     AccountStatusProc *SetAccountStatusCallback(AccountStatusProc *pNewCallback, void *Param) { AccountStatusProc *pPrev = pAccountProcessor; pAccountProcessor = pNewCallback; AccountProcessorParam = Param; return pPrev; }
  617.     AdminCommandProcessorProc *SetAdminProcessorCallback(AdminCommandProcessorProc *pNewCallback, void *Param) { AdminCommandProcessorProc *pPrev = pAdminProcessor; pAdminProcessor = pNewCallback; AdminProcessorParam = Param; return pPrev; }
  618.  
  619.     MessageProcessorProc *SetMessageProcessorCallback(MessageProcessorProc *pNewCallback, void *Param, void *&OldParam) { MessageProcessorProc *pPrev = pMessageProcessor; pMessageProcessor = pNewCallback; OldParam = MessageProcessorParam; MessageProcessorParam = Param; return pPrev; }
  620.     DatabaseChangeProc *SetDatabaseChangeCallback(DatabaseChangeProc *pNewCallback, void *Param, void *&OldParam) { DatabaseChangeProc *pPrev = pDBProcessor; pDBProcessor = pNewCallback; OldParam = DBProcessorParam; DBProcessorParam = Param; return pPrev; }
  621.     BotNetUserUpdateProc *SetBotNetUserChangeCallback(BotNetUserUpdateProc *pNewCallback, void *Param, void *&OldParam) { BotNetUserUpdateProc *pPrev = pBNUProcessor; pBNUProcessor = pNewCallback; OldParam = BNUProcessorParam; BNUProcessorParam = Param; return pPrev; }
  622.     BotNetChatProc *SetBotNetChatCallback(BotNetChatProc *pNewCallback, void *Param, void *&OldParam) { BotNetChatProc *pPrev = pBNCProcessor; pBNCProcessor = pNewCallback; OldParam = BNCProcessorParam; BNCProcessorParam = Param; return pPrev; }
  623.     AccountStatusProc *SetAccountStatusCallback(AccountStatusProc *pNewCallback, void *Param, void *&OldParam) { AccountStatusProc *pPrev = pAccountProcessor; pAccountProcessor = pNewCallback; OldParam = AccountProcessorParam; AccountProcessorParam = Param; return pPrev; }
  624.     AdminCommandProcessorProc *SetAdminProcessorCallback(AdminCommandProcessorProc *pNewCallback, void *Param, void *&OldParam) { AdminCommandProcessorProc *pPrev = pAdminProcessor; pAdminProcessor = pNewCallback; OldParam = AccountProcessorParam; AdminProcessorParam = Param; return pPrev; }
  625.  
  626.     DWORD DispatchEvent(void);
  627.     const char *GetPrivilegeMaskFlags(const PrivilegeMask *pMask);
  628.     UserAttributes TranslateFlags(const char *pszFlags);
  629.     PrivilegeMask *FindMask(const char *pszMask);
  630.     BotNetUserInfo2 *FindBotNetUser(const char *pszName);
  631.     BotNetUserInfo2 *FindBotNetUser(DWORD dwId);
  632.     BotNetUserInfo2 *FindBotNetUserByAccount(const char *pzsAccount);
  633.     void EnumBotNetUsers(void);
  634.     void EnumPrivilegeMasks(void);
  635.  
  636.     static DWORD __cdecl DefaultMessageProcessor(const char *pszMessage, const char *pszSender,
  637.         ListEx <PrivilegeMask *>& Database, ListEx <BotNetUserInfo *>& BotNetUsers, void *Param);
  638.     static DWORD __cdecl DefaultDatabaseChangeProcessor(DWORD dwFlags, PrivilegeMask *pUser,
  639.         UserAttributes OriginalAttributes, ListEx <PrivilegeMask *>& Database,
  640.         ListEx <BotNetUserInfo *>& BotNetUsers, void *Param);
  641.     static void __cdecl DefaultBotNetUserUpdateProcessor(DWORD dwFlags, BotNetUserInfo *pUser,
  642.         void *Param);
  643.     static DWORD __cdecl DefaultBotNetChatProcessor(DWORD dwMessageType, DWORD dwMessageAction,
  644.         const BotNetUserInfo *pSender, const char *pszMessage, void *Param);
  645.     static DWORD __cdecl DefaultAccountUpdateProcessor(DWORD dwEvent, BotNetUserInfo *pUser,
  646.         const char *pszNewAccountName, void *Param);
  647.     static DWORD __cdecl DefaultAdminCommandProcessor(DWORD dwEvent, BotNetUserInfoEx *pUser,
  648.         DWORD dwBannedAddresses[128], void *Param);
  649. private:
  650.     enum {
  651.         DISCONNECTED,
  652.         CONNECTING,
  653.         CONNECTED,
  654.         LOGGEDON
  655.     };
  656.     enum {
  657.         Packet_Idle             =       0x00,
  658.         Packet_Logon            =       0x01,
  659.         Packet_StatsUpdate      =       0x02,
  660.         Packet_Database         =       0x03,
  661.         Packet_Message          =       0x04,
  662.         Packet_Cycle            =       0x05,
  663.         Packet_UserInfo         =       0x06,
  664.         Packet_BroadcastMessage =       0x07,
  665.         Packet_NarrowMessage    =       0x08,
  666.         Packet_ChangeDBPassword =       0x09,
  667.         Packet_BotNetVersion    =       0x0a,
  668.         Packet_BotNetChat       =       0x0b,
  669.         Packet_Admin            =       0x0c,
  670.         Packet_Account          =       0x0d,
  671.         Packet_DBExtensions     =       0x0e
  672.     };
  673.     enum {
  674.         Packet_UserLoggingOff   =       0x07
  675.     };
  676.     enum {
  677.         DBMessage_RequestDB     =       0x01,
  678.         DBMessage_ModifyEntry   =       0x02,
  679.         DBMessage_DeleteEntry   =       0x03
  680.     };
  681.     enum {
  682.         Logon_Failed            =       0x00,
  683.         Logon_Accepted          =       0x01
  684.     };
  685.     enum {
  686.         Update_Failed           =       0x00,
  687.         Update_Accepted         =       0x01
  688.     };
  689.     enum {
  690.         Version_Current         =       0x01
  691.     };
  692.     enum {
  693.         IdleInterval            =       120
  694.     };
  695.     enum {
  696.         ChatMsg_Broadcast       =       0x00,
  697.         ChatMsg_Database        =       0x01
  698.     };
  699.     enum {
  700.         Admin_Kick_User         =       0x00,
  701.         Admin_Ban_User          =       0x01,
  702.         Admin_Query_User        =       0x02,
  703.         Admin_Query_Bans        =       0x03,
  704.         Admin_Unban_IP          =       0x04,
  705.         Admin_Is_Privileged     =       0x05    /* Can use Admin commands */
  706.     };
  707.     enum {
  708.         DB_Privilege_List       =       0x00,
  709.         DB_Set_Negate_Mode      =       0x01
  710.     };
  711.  
  712.     void SendLogon(void);
  713.     void SendUsersRequest(void);
  714.     void SendDatabaseRequest(void);
  715.     void SendDBModify(const PrivilegeMask *pMask);
  716.     void SendDBDelete(const PrivilegeMask *pMask);
  717.     void SendStatsUpdate(void);
  718.     void SendDBPasswordChange(DWORD PassId, const char* NewDBPass);
  719.     void SendIdle(void);
  720.     void SendAdminKickUser(DWORD dwUserId);
  721.     void SendAdminBanUser(DWORD dwUserId);
  722.     void SendAdminUnbanIP(DWORD dwIP);
  723.     void SendAdminQueryUser(DWORD dwUserId);
  724.     void SendAdminQueryBans(void);
  725.     void SendAccountLogon(const char *pszName, const char *pszPassword);
  726.     void SendAccountChangePassword(const char *pszName, const char *pszOldPassword,
  727.         const char *pszNewPassword);
  728.     void SendAccountCreate(const char *pszName, const char *pszPassword);
  729.     void SendDBNegateMode(bool bNegateUnderprivileged);
  730.  
  731.     void SendPacket(unsigned char Id, VirtualBuffer& vData);
  732.  
  733.     void ClearCycle(void);
  734.     void ClearDatabase(void);
  735.  
  736.     DWORD DispatchPacket(unsigned char Id, VirtualBuffer& PacketData);
  737.  
  738.     // Event handlers
  739.     DWORD OnLogon(VirtualBuffer& PacketData);
  740.     DWORD OnStatsUpdate(VirtualBuffer& PacketData);
  741.     DWORD OnDatabaseCommand(VirtualBuffer& PacketData);
  742.     DWORD OnMessage(VirtualBuffer& PacketData);
  743.     DWORD OnCycle(VirtualBuffer& PacketData);
  744.     DWORD OnUserInfo(VirtualBuffer& PacketData);
  745.     DWORD OnUserLoggingOff(VirtualBuffer& PacketData);
  746.     DWORD OnChangeDBPassword(VirtualBuffer& PacketData);
  747.     DWORD OnBotNetVersion(VirtualBuffer& PacketData);
  748.     DWORD OnBotNetChat(VirtualBuffer& PacketData);
  749.     DWORD OnBotNetAdmin(VirtualBuffer& PacketData);
  750.     DWORD OnBotNetAccountStatus(VirtualBuffer& PacketData);
  751.     DWORD OnDatabaseExtension(VirtualBuffer& PacketData);
  752.  
  753.     SOCKET sBotNetSocket;
  754.     SOCKADDR_IN BotNetServerAddress;
  755.     HANDLE hBotNetData;
  756.     SocketBuffers BotNetBuffers;
  757.     char *pszBotNetServerPassword;
  758.     char *pszBotNetDatabase, *pszBotNetDatabasePassword;
  759.     char *pszUniqueName;
  760.     char *pszChannel, *pszPreCycleChannel;
  761.     char *pszAccountName, *pszAccountPassword;
  762.     char Buffer[4096];
  763.     int State;
  764.     int BufferLength;
  765.     time_t CycleEnd, NextIdleTime;
  766.     bool IsAdmin;
  767.     bool IsNegateEnabled;
  768.     bool bPreferredNegateMode;
  769.     DWORD SelfId;
  770.     DWORD dwConnectError;
  771.     DWORD dwBattleNetServer;
  772.     DWORD dwServerVersion;
  773.     DWORD dwDatabaseAccess;
  774.     ListEx <BotNetUserInfo *> BotNetUsers;
  775.     ListEx <PrivilegeMask *> Database;
  776. //  BotOutput *Output;
  777. //  addqueueproc *addqueue;
  778. //  queuebuf *packetqueue;
  779.     static const char *pszBotName;
  780.     bool bFirstUserListingThisConnection;
  781.     MessageProcessorProc *pMessageProcessor;
  782.     DatabaseChangeProc *pDBProcessor;
  783.     BotNetUserUpdateProc *pBNUProcessor;
  784.     BotNetChatProc *pBNCProcessor;
  785.     AccountStatusProc *pAccountProcessor;
  786.     AdminCommandProcessorProc *pAdminProcessor;
  787.     void *MessageProcessorParam, *DBProcessorParam, *BNUProcessorParam, *BNCProcessorParam;
  788.     void *AccountProcessorParam, *AdminProcessorParam;
  789. };
  790.  
  791.  
  792. // End BotNetClient API
  793.  
  794. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement