From Miranda NG
Jump to: navigation, search
/* DB/Event/Added event
Called when a new event has been added to the event chain for a contact
  wParam = (MCONTACT)hContact
  lParam = (LPARAM)(HANDLE)hDbEvent
hDbEvent is a valid handle to the event. hContact is a valid handle to the
contact to which hDbEvent refers.
Since events are sorted chronologically, you cannot guarantee that hDbEvent is
at any particular position in the chain.
int OnMessageEvent(WPARAM wParam, LPARAM lParam) {
	MCONTACT hContact = (MCONTACT)wParam;
	HANDLE hDbEvent = (HANDLE)lParam;
	Retrieves all the information stored in hDbEvent
	hDbEvent should have been returned by db_event_add/first/last/next/prev()
	Returns 0 on success or nonzero if hDbEvent is invalid
	Don't forget to set dbe.cbSize, dbe.pBlob and dbe.cbBlob before calling this
	The correct value dbe.cbBlob can be got using db/event/getblobsize
	If successful, all the fields of dbe are filled. dbe.cbBlob is set to the
	actual number of bytes retrieved and put in dbe.pBlob
	If dbe.cbBlob is too small, dbe.pBlob is filled up to the size of dbe.cbBlob
	and then dbe.cbBlob is set to the required size of data to go in dbe.pBlob
	On return, dbe.szModule is a pointer to the database module's own internal list
	of modules. Look but don't touch.
        int cbLen = db_event_getBlobSize(hDbEvent);
        BYTE *pbBuffer = (BYTE*)mir_alloc(cbLen);
	DBEVENTINFO dbei = { 0 };
	dbei.cbSize = sizeof(dbei);
	dbei.cbBlob = cbLen;
	dbei.pBlob = pbBuffer;
	if(db_event_get(hDbEvent, &dbei) != 0)
		return 0;
	if (dbei.eventType == EVENTTYPE_MESSAGE) { // check for message
		// look at (char)pbBuffer
	return 0;

extern "C" __declspec(dllexport) int Load()
        // here you hook the event for received messages
	HookEvent(ME_DB_EVENT_ADDED, OnMessageEvent);
        // Here you do your other stuffs
	return 0;