Logger example simply puts every event into a file called log.txt.
plugin.cpp
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <islprontoapi/islpronto_plugin.h>
void connection_info(FILE *f, ISLProntoConnectionInfo info)
{
if(info) {
#define INFO(_x) \
if(ISLProntoStringCxx value = ISLPronto->ConnectionInfoGetKey(info, _x)) \
fwprintf(f, L"%s = [%s]\n", L#_x, value.AsWide());
INFO(ISLPRONTO_CONNECTION_INFO_ID);
INFO(ISLPRONTO_CONNECTION_INFO_SERVER);
INFO(ISLPRONTO_CONNECTION_INFO_USERNAME);
INFO(ISLPRONTO_CONNECTION_INFO_DESCRIPTION);
#undef INFO
}
}
void client(void *, int event_type, ISLProntoClientInfo info)
{
if(FILE *f = _wfopen(L"log.txt", L"a, ccs=UTF-16LE")) {
{
time_t now = time(0);
const wchar_t *t = L"unknown event";
switch(event_type) {
case ISLPRONTO_CLIENT_EVENT_NEW:
t = L"new client";
break;
case ISLPRONTO_CLIENT_EVENT_UPDATE:
t = L"client info update";
break;
case ISLPRONTO_CLIENT_EVENT_GONE:
t = L"client is gone";
break;
}
fwprintf(f, L"%sEVENT = %s\n", _wctime(&now), t);
}
#define INFO(_x) \
if(ISLProntoStringCxx value = ISLPronto->ClientInfoGetKey(info, _x)) \
fwprintf(f, L"%s = [%s]\n", L#_x, value.AsWide());
connection_info(f, ISLPronto->ClientInfoAccessConnectionInfo(info));
INFO(ISLPRONTO_CLIENT_INFO_ID); // do not use as primary key, it's unique only until reboot of ISL Conference Proxy
INFO(ISLPRONTO_CLIENT_INFO_NAME);
INFO(ISLPRONTO_CLIENT_INFO_EMAIL);
INFO(ISLPRONTO_CLIENT_INFO_TIME);
INFO(ISLPRONTO_CLIENT_INFO_URL);
INFO(ISLPRONTO_CLIENT_INFO_REFERRER);
INFO(ISLPRONTO_CLIENT_INFO_BROWSER);
INFO(ISLPRONTO_CLIENT_INFO_GEO_COUNTRY_CODE);
INFO(ISLPRONTO_CLIENT_INFO_GEO_COUNTRY);
INFO(ISLPRONTO_CLIENT_INFO_GEO_CITY);
INFO(ISLPRONTO_CLIENT_INFO_IP);
INFO(ISLPRONTO_CLIENT_INFO_INTERNAL_IP);
INFO(ISLPRONTO_CLIENT_INFO_REVERSE_DNS);
INFO(ISLPRONTO_CLIENT_INFO_CHAT_ID); // use this as primary key, because it is always unique
if(ISLProntoCustomFields fields = ISLPronto->ClientInfoGetCustomFields(info)) {
for(int i=0; i<ISLPronto->CustomFieldsCount(fields); ++i) {
if(ISLProntoStringCxx key = ISLPronto->CustomFieldsGetKey(fields, i)) {
if(ISLProntoStringCxx value = ISLPronto->CustomFieldsGetValue(fields, i))
fwprintf(f, L"custom field [%s]=[%s]\n", key.AsWide(), value.AsWide());
}
}
// if you know the key name, you can use:
//{
// ISLProntoStringCxx key = ISLPronto->StringFromUtf8("f1");
// if(ISLProntoStringCxx value = ISLPronto->CustomFieldsGetKeyValue(fields, key.Get()))
// fwprintf(f, L"custom field [f1]=[%s]\n", value.AsWide());
//}
ISLPronto->FreeCustomFields(fields);
}
#undef INFO
fwprintf(f, L"--\n");
fclose(f);
}
}
void user(void *, int event_type, ISLProntoUserInfo info)
{
if(FILE *f = _wfopen(L"log.txt", L"a, ccs=UTF-16LE")) {
{
time_t now = time(0);
const wchar_t *t = L"unknown event";
switch(event_type) {
case ISLPRONTO_USER_EVENT_NEW:
t = L"new user";
break;
case ISLPRONTO_USER_EVENT_UPDATE:
t = L"user info update";
break;
case ISLPRONTO_USER_EVENT_GONE:
t = L"user is gone";
break;
}
fwprintf(f, L"%sEVENT = %s\n", _wctime(&now), t);
}
{
const wchar_t *t = L"unknown";
switch(ISLPronto->UserInfoGetStatus(info)) {
case ISLPRONTO_USER_STATUS_AVAILABLE: t = L"available"; break;
case ISLPRONTO_USER_STATUS_BUSY: t = L"busy"; break;
case ISLPRONTO_USER_STATUS_UNAVAILABLE: t = L"unavailable"; break;
}
fwprintf(f, L"status: %s\n", t);
}
fwprintf(f, L"myself: %d\n", ISLPronto->UserInfoIsMyself(info));
#define INFO(_x) \
if(ISLProntoStringCxx value = ISLPronto->UserInfoGetKey(info, _x)) \
fwprintf(f, L"%s = [%s]\n", L#_x, value.AsWide());
connection_info(f, ISLPronto->UserInfoAccessConnectionInfo(info));
INFO(ISLPRONTO_USER_INFO_ID); // do not use as primary key, it's unique only until reboot of ISL Conference Proxy
INFO(ISLPRONTO_USER_INFO_MYSELF);
INFO(ISLPRONTO_USER_INFO_NAME);
INFO(ISLPRONTO_USER_INFO_EMAIL);
INFO(ISLPRONTO_USER_INFO_PHOTO);
INFO(ISLPRONTO_USER_INFO_GEO_COUNTRY_CODE);
INFO(ISLPRONTO_USER_INFO_GEO_COUNTRY);
INFO(ISLPRONTO_USER_INFO_GEO_CITY);
if(ISLProntoStringSet s = ISLPronto->UserInfoGetChatMembership(info)) {
for(ISLProntoStringCxx id; id = ISLPronto->StringSetIterateGet(s); ISLPronto->StringSetIterateAdvance(s))
fwprintf(f, L"member of chat [%s]\n", id.AsWide());
ISLPronto->FreeStringSet(s);
}
if(ISLProntoStringSet s = ISLPronto->UserInfoGetFilterMembership(info)) {
// if you know the name of the filter:
//{
// ISLProntoStringCxx key = ISLPronto->StringFromUtf8("sales");
// if(ISLPronto->StringSetContains(s, key.Get())) {
// ...
// }
//}
for(ISLProntoStringCxx id; id = ISLPronto->StringSetIterateGet(s); ISLPronto->StringSetIterateAdvance(s))
fwprintf(f, L"member of filter [%s]\n", id.AsWide());
ISLPronto->FreeStringSet(s);
}
#undef INFO
fwprintf(f, L"--\n");
fclose(f);
}
}
void chat(void *, ISLProntoChatInfo info)
{
if(FILE *f = _wfopen(L"log.txt", L"a, ccs=UTF-16LE")) {
{
time_t now = time(0);
fwprintf(f, L"%sEVENT = chat update\n", _wctime(&now));
}
fwprintf(f, L"I am in chat = %d\n", ISLPronto->ChatInfoIAmMember(info));
fwprintf(f, L"I am only one in chat = %d\n", ISLPronto->ChatInfoIAmOnlyOneInChat(info));
#define INFO(_x) \
if(ISLProntoStringCxx value = ISLPronto->ChatInfoGetKey(info, _x)) \
fwprintf(f, L"%s = [%s]\n", L#_x, value.AsWide());
connection_info(f, ISLPronto->ChatInfoAccessConnectionInfo(info));
INFO(ISLPRONTO_CHAT_INFO_ID); // use this as primary key, because it is always unique
if(ISLProntoStringSet s = ISLPronto->ChatInfoGetMemberClients(info)) {
for(ISLProntoStringCxx id; id = ISLPronto->StringSetIterateGet(s); ISLPronto->StringSetIterateAdvance(s))
fwprintf(f, L"member client [%s]\n", id.AsWide());
ISLPronto->FreeStringSet(s);
}
if(ISLProntoStringSet s = ISLPronto->ChatInfoGetMemberUsers(info)) {
for(ISLProntoStringCxx id; id = ISLPronto->StringSetIterateGet(s); ISLPronto->StringSetIterateAdvance(s))
fwprintf(f, L"member user [%s]\n", id.AsWide());
ISLPronto->FreeStringSet(s);
}
#undef INFO
fwprintf(f, L"--\n");
fclose(f);
}
}
void message(void *, ISLProntoMessageInfo info)
{
if(FILE *f = _wfopen(L"log.txt", L"a, ccs=UTF-16LE")) {
{
time_t now = time(0);
fwprintf(f, L"%sEVENT = message\n", _wctime(&now));
}
{
const wchar_t *t = L"?";
switch(ISLPronto->MessageInfoGetType(info)) {
case ISLPRONTO_MESSAGE_TYPE_SUPPORTER_COMMENT: t = L"supporter comment"; break;
case ISLPRONTO_MESSAGE_TYPE_SUPPORTER: t = L"supporter"; break;
case ISLPRONTO_MESSAGE_TYPE_CLIENT: t = L"client"; break;
case ISLPRONTO_MESSAGE_TYPE_SYSTEM: t = L"system"; break;
case ISLPRONTO_MESSAGE_TYPE_RESET_CHAT: t = L"reset chat"; break;
case ISLPRONTO_MESSAGE_TYPE_RESET_CHAT_DONE: t = L"reset chat done"; break;
}
fwprintf(f, L"message type = %s\n", t);
}
fwprintf(f, L"replay message = %d\n", ISLPronto->MessageInfoIsReplay(info));
#define INFO(_x) \
if(ISLProntoStringCxx value = ISLPronto->MessageInfoGetKey(info, _x)) \
fwprintf(f, L"%s = [%s]\n", L#_x, value.AsWide());
if(ISLProntoConnectionInfo cinfo = ISLPronto->MessageInfoAccessConnectionInfo(info)) {
if(ISLProntoStringCxx value = ISLPronto->ConnectionInfoGetKey(cinfo, ISLPRONTO_CONNECTION_INFO_ID))
fwprintf(f, L"connection id = %s\n", value.AsWide());
}
if(ISLProntoUserInfo cinfo = ISLPronto->MessageInfoAccessUserInfo(info)) {
if(ISLProntoStringCxx value = ISLPronto->UserInfoGetKey(cinfo, ISLPRONTO_USER_INFO_ID))
fwprintf(f, L"user id = %s\n", value.AsWide());
}
if(ISLProntoClientInfo cinfo = ISLPronto->MessageInfoAccessClientInfo(info)) {
if(ISLProntoStringCxx value = ISLPronto->ClientInfoGetKey(cinfo, ISLPRONTO_CLIENT_INFO_ID))
fwprintf(f, L"client id = %s\n", value.AsWide());
}
INFO(ISLPRONTO_MESSAGE_INFO_TIME);
INFO(ISLPRONTO_MESSAGE_INFO_RAWHTML);
INFO(ISLPRONTO_MESSAGE_INFO_TEXT);
#undef INFO
fwprintf(f, L"--\n");
fclose(f);
}
}
void ISLProntoPluginStart()
{
// uncomment if you wish to debug the plugin
//ISLPronto->AttachDebugger();
ISLPronto->RegisterClientEventHandler(client, 0);
ISLPronto->RegisterUserEventHandler(user, 0);
ISLPronto->RegisterChatEventHandler(chat, 0);
ISLPronto->RegisterMessageEventHandler(message, 0);
}
ISLPRONTO_PLUGIN(ISLProntoPluginStart)