// mIRCTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "mirc.h" #include using namespace std; #define WM_EVALUATE WM_USER + 201 #define WM_MCOMMAND WM_USER + 200 struct user_t { char szUserName[128]; // add more here later (usermodes, PMs, etc etc) }; struct channel_t { char szChannelName[255]; vector vszMessages; vector vUsers; }; struct server_t { vector vChannels; char szServerName[255]; }; vector vServers; void sendCommand(char *str) { static HWND mirchWnd = NULL; if (!mirchWnd) mirchWnd = FindWindow("mIRC", NULL); if (!mirchWnd) return; HANDLE hFileMap; LPSTR mData; hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,4096,"mIRC"); mData = (LPSTR)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0); wsprintf(mData,str); UnmapViewOfFile(mData); CloseHandle(hFileMap); SendMessage(mirchWnd, WM_MCOMMAND,1,0); //SEND! } HANDLE hFileMap; LPSTR szData; HWND hwndmIRC; void RefilData(){ hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,4096,"mIRC"); szData = (LPSTR)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0); hwndmIRC = FindWindow("mIRC",NULL); // Ensure the handle is valid, if so, retrive the information if(hwndmIRC){ // List our servers int iServerCount = 0; sprintf(szData, "$scon(0)"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); iServerCount = atoi(szData); // Test for(int i=1; i <= iServerCount; i++){ // Ok, spit out the server information sprintf(szData, "$scon(%i).network", i); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); // Cool! make a new server entry server_t *new_server = new server_t; // Fill! sprintf(new_server->szServerName, szData); // Once we find a new server, we need to fill up the channel information // Prepare a few scripts to count channels and set some variables sprintf(szData, "/alias ChannelCount { var %%i = $chan(0) | return %%i }" ); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData,"/alias ChannelLast { /set -n %%gmirc_lastchan $chan($1) }" ); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); // Ok, how many channels do we have? sprintf(szData, "$scon(%i).ChannelCount", i); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); int iChannelCount = atoi(szData); // Lets list teh chans k lol for(int ii=1; ii <= iChannelCount; ii++){ // Fill the variable channel_t *new_channel = new channel_t; sprintf(szData, "/scon %i ChannelLast %i", i, ii); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); // read the data sprintf(szData, "%%gmirc_lastchan"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); sprintf(new_channel->szChannelName, szData); // Grab all the users // Build a script to pull some information sprintf(szData, "/alias UpdateUserCount { /set -n %%gmirc_usercount $nick($chan($1),0) }"); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "/alias UpdateUserName { /set -n %%gmirc_lastuser $nick($chan($1),$2) }"); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "/scon %i UpdateUserCount %i", i, ii); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "%%gmirc_usercount"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); int iUserCount = atoi(szData); printf("Total users: %i\n", iUserCount); for (unsigned int iii=1; iii <= iUserCount; iii++) { user_t *new_user = new user_t; sprintf(szData, "/scon %i UpdateUserName %i %i", i, ii, iii); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "%%gmirc_lastuser"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); sprintf(new_user->szUserName, szData); new_channel->vUsers.push_back(new_user); } // NOW! loop through all the lines of text, MESSSSY! sprintf(szData, "/alias UpdateLineCount { /set -n %%gmirc_linecount $line($chan($1),0) }" ); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData,"/alias UpdateLineLast { /set -n %%gmirc_lastline $line($chan($1),$2) }" ); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "/scon %i UpdateLineCount %i", i, ii); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "%%gmirc_linecount"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); int iLineCount = atoi(szData); for (unsigned int il=1; il < iLineCount; il++ ) { char *new_line = new char[560]; sprintf(szData, "/scon %i UpdateLineLast %i %i", i, ii, il); SendMessage(hwndmIRC, WM_MCOMMAND, 1, 0); sprintf(szData, "%%gmirc_lastline"); SendMessage(hwndmIRC, WM_EVALUATE, 0, 0); new_channel->vszMessages.push_back(new_line); } new_server->vChannels.push_back(new_channel); } // Fill the servers vServers.push_back(new_server); } } } int _tmain(int argc, _TCHAR* argv[]) { RefilData(); /* for(unsigned int i=0; i < vServers.size(); i++) { printf("\n(%i) Server name: %s\n", i+1, vServers[i]->szServerName); for(unsigned int ii=0; ii < vServers[i]->vChannels.size(); ii++) { printf("\t(%i) Channel: %s\n", ii, vServers[i]->vChannels[ii]->szChannelName); // ANOTHER LOOP! LOL! for (unsigned int iii=0; iii < vServers[i]->vChannels[ii]->vUsers.size(); iii++) { printf("\t\t(%i) User: %s\n", iii, vServers[i]->vChannels[ii]->vUsers[iii]->szUserName); } } } */ return 0; }