rendered paste body// mIRCTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "mirc.h"
#include <vector>
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<char*> vszMessages;
vector<user_t*> vUsers;
};
struct server_t {
vector<channel_t*> vChannels;
char szServerName[255];
};
vector <server_t*> 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;
}