#ifndef _CHANNEL_H
#define _CHANNEL_H
#include <iostream>
#include <list>
#include <mysql/mysql.h>
#include "merc.h"
class Topic;
class Post;
class Channel;
extern MYSQL *db;
extern std::list<Channel *> chanList;
typedef void (Channel::*CmdFun)(ACCOUNT *, char *);
struct Command
{ char *name;
CmdFun cmdfun;
bool onReq;
};
extern struct Command chanCmdTable[];
class Channel
{ public:
char *name;
std::list<Topic *> topics;
int bit;
int lastTID;
Channel(char *name);
~Channel();
void Send(ACCOUNT *pAcnt, std::string &txt);
Topic *getTopic(int id);
void interpret(ACCOUNT *pAcnt, char *name);
void LoadTopics();
void TopicHist(ACCOUNT *pAcnt, char *argument);
void HandleBanned(ACCOUNT *pAcnt, char *argument);
void New(ACCOUNT *, char *);
void Ignore(ACCOUNT *, char *);
void Acknowledge(ACCOUNT *, char *);
void On(ACCOUNT *, char *);
void Off(ACCOUNT *, char *);
void History(ACCOUNT *, char *);
void Lock(ACCOUNT *, char *);
bool CheckChanFunc(ACCOUNT *pAcnt, char *argument )
{ char cmd[MSL];
argument = one_argument(argument,cmd);
if(cmd[0] == '\0')
return false;
for( int i = 0; chanCmdTable[i].name != NULL ; ++i )
{ if(!str_prefix(cmd, chanCmdTable[i].name) )
{ if(!IS_SET(pAcnt->channel, bit) && chanCmdTable[i].onReq)
ptc(pAcnt, "You have to have the channel on to use this function.\n\r");
else
(this->*(chanCmdTable[i].cmdfun))(pAcnt, argument);
return true;
}
}
return false;
}
static void loadChannels()
{ MYSQL_ROW row;
MYSQL_RES *res;
int maxChans;
char query[MSL];
sprintf(query, "SELECT * FROM Channels");
if( mysql_real_query(db, query, strlen(query)) )
{ logfp(LOG_BUG, "loadChannels: %s", mysql_error(db) );
return;
}
if( !(res = mysql_store_result(db) ) )
{ logfp(LOG_BUG, "loadChannels: Result null!");
return;
}
if( (maxChans = mysql_num_rows(res) ) <= 0 )
{ logfp(LOG_BUG, "loadChannels: rows <= 0" );
mysql_free_result(res);
return;
}
for(int i = 0; i < maxChans; i++ )
{ row = mysql_fetch_row(res);
Channel *chan = new Channel(row[0]);
chan->bit = atoi(row[1]);
chan->lastTID = atoi(row[2]);
chanList.push_back(chan);
chan->LoadTopics();
}
mysql_free_result(res);
}
static Channel *find(const char *name)
{ std::list<Channel *>::iterator i;
for( i = chanList.begin() ; i != chanList.end() ; ++i )
{ if(LOWER(name[0]) == LOWER((*i)->name[0]) &&
!str_prefix(name, (*i)->name) )
return (*i);
}
return NULL;
}
private:
Channel( const Channel & );
};
class Topic
{ public:
char *name;
char *subject;
int id;
Channel *on;
int lastPID;
bool locked;
std::list<Post *> posts;
Topic(Channel *parent);
~Topic();
void Send();
Post *getPost(int id);
void Lock(){ locked = true; }
void Unlock() { locked = false; }
void Log();
void LoadPosts();
void PostHist(ACCOUNT *, char *);
private:
Topic( const Topic & );
};
class Post
{ public:
char *poster;
std::list<Post *> replies;
int parentID;
int id;
Topic *on;
char *msg;
time_t timeStamp;
Post(Topic *);
Post(Post *);
~Post();
void Send();
void Log();
private:
Post( const Post & );
};
#endif