/*
* Code from: Philipp Meinen
* Copyright (C): 2003-2004 Philipp Meinen
*
* Email: lancelot@lancelot2k.dyndns.org
* Homepage: http://lancelot2k.dyndns.org
* License: GPL
* */
#define _USERDB_CC_
#include <cstdio>
#include <cstring>
#include "userdb.h"
UserDB::UserDB(void)
{
users = NULL;
users = new Parameter * [CHANNELS_MAX];
for(int i = 0; i < CHANNELS_MAX; i++)
{
users[i] = NULL;
channel[i][0] = '\0';
}
return;
}
UserDB::~UserDB(void)
{
if(users) {
for(int i = 0; i < CHANNELS_MAX; i++)
if(users[i]) delete users[i];
delete[] users;
}
return;
}
void UserDB::Reset_UserDB(char * tmp_channel)
{
string_tolower(tmp_channel); /* channelnames are stores lowercase */
int index = Get_Index_for_Channel(tmp_channel);
if((index < 0) || (index >= CHANNELS_MAX)) return;
if(users[index]) {
delete users[index];
users[index] = NULL;
}
channel[index][0] = '\0';
return;
}
void UserDB::Reset_All_UserDB(void)
{
for(int i = 0; i < CHANNELS_MAX; i++)
Reset_UserDB(i);
return;
}
void UserDB::Init_UserDB(char * new_channel)
{
if(new_channel == NULL) return;
if(new_channel[0] == '\0') return;
string_tolower(new_channel); /* channelnames are stores lowercase */
/* is there allready a channel with this name? */
int index = Get_Index_for_Channel(new_channel);
if(index != -1) return;
/* search for a left slot */
index = -1;
int i;
int len = (signed)strlen(new_channel);
if(len < 1) return;
for(i = 0; i < CHANNELS_MAX; i++)
{
if((users[i] == NULL) && (channel[i][0] == '\0')) {
index = i;
break;
}
}
if(index == -1) return;
snprintf(channel[index], CHANNELS_NAME_LEN, "%s", new_channel);
users[index] = new Parameter;
return;
}
void UserDB::Add_User(char * new_user, char * tmp_channel)
{
if(new_user == NULL || tmp_channel == NULL) return;
if(new_user[0] == '\0' || tmp_channel[0] == '\0') return;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
if(Is_User_in_Channel(new_user, tmp_channel) != -1) return; /* this user is allready in this channel */
int index = Get_Index_for_Channel(tmp_channel);
if(index == -1) return;
users[index]->Add_Parameter(new_user);
return;
}
void UserDB::Remove_User_from_Channel(char * tmp_user, char * tmp_channel)
{
if(tmp_user == NULL || tmp_channel == NULL) return;
if(tmp_user[0] == '\0' || tmp_channel[0] == '\0') return;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
int index = Get_Index_for_Channel(tmp_channel);
if(index == -1) return;
int user_index = Is_User_in_Channel(tmp_user, tmp_channel);
if(user_index == -1) return;
users[index]->Remove_Parameter(user_index);
return;
}
void UserDB::Remove_User_from_Channel(int user_index, char * tmp_channel)
{
if(tmp_channel == NULL) return;
if(tmp_channel[0] == '\0') return;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
int index = Get_Index_for_Channel(tmp_channel);
if(index == -1) return;
users[index]->Remove_Parameter(user_index);
return;
}
void UserDB::Remove_User_from_all_Channels(char * tmp_user)
{
for(int i = 0; i < CHANNELS_MAX; i++)
{
if(channel[i][0] != '\0')
Remove_User_from_Channel(tmp_user, channel[i]);
}
return;
}
int UserDB::Is_User_in_Channel(char * tmp_user, char * tmp_channel)
{
if(tmp_user == NULL || tmp_channel == NULL) return -1;
if(tmp_user[0] == '\0' || tmp_channel[0] == '\0') return -1;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
int index = Get_Index_for_Channel(tmp_channel);
if(index == -1) return -1;
int num_users = users[index]->Get_Num_Parameter();
/* read the first parameter */
char * tmp_ptr = users[index]->GetFirstElement();
if(tmp_ptr != NULL) {
if(strcmp(tmp_ptr, tmp_user) == 0)
return users[index]->Get_Last_Parameter();;
}
for(int i = 0; i <= num_users; i++)
{
tmp_ptr = users[index]->GetNextElement();
if(tmp_ptr == NULL) continue;
if(strcmp(tmp_ptr, tmp_user) == 0)
return users[index]->Get_Last_Parameter();
}
return -1; /* name not found :.( */
}
int UserDB::Get_Index_for_Channel(char * tmp_channel)
{
if(tmp_channel == NULL) return -1;
if(tmp_channel[0] == '\0') return -1;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
for(int i = 0; i < CHANNELS_MAX; i++) {
if(strcmp(channel[i], tmp_channel) == 0) return i;
}
return -1;
}
void UserDB::Reset_UserDB(int index)
{
if((index < 0) || (index >= CHANNELS_MAX)) return;
if(users[index]) {
delete users[index];
users[index] = NULL;
}
channel[index][0] = '\0';
return;
}
int UserDB::Get_Num_Users_in_Channel(char * tmp_channel)
{
if(tmp_channel == NULL) return 0;
if(tmp_channel[0] == '\0') return 0;
string_tolower(tmp_channel); /* channelnames are stores lowercase */
int index = Get_Index_for_Channel(tmp_channel);
if(index == -1) return 0;
return users[index]->Get_Num_Parameter();
}
void UserDB::ListUsersToScreen(char * search_pattern)
{
int active_channel = Classes.IrcScreen->GetActiveChannel();
int screen_type = Classes.IrcScreen->GetScreenType(active_channel);
int screen_use = Classes.IrcScreen->GetScreenUse(active_channel);
if(!active_channel || screen_type || !screen_use) {
help_me("who");
return;
}
int num_users_on_one_line = (((Classes.IrcScreen->GetScreenCols() - TIME_AND_NICKLEN) / NICKNAME_LEN));
if(num_users_on_one_line < 1) num_users_on_one_line = 1;
int bufferlen = (num_users_on_one_line * (NICKNAME_LEN+1)) + 1;
char tmp_names[bufferlen];
tmp_names[0] = '\0';
int num_spaces = 0;
char * nickname;
char * channelname = Classes.IrcScreen->GetChannelName(active_channel);
int index = Get_Index_for_Channel(channelname);
if(index == -1) return; /* no such channel */
int entrys = users[index]->Get_Num_Parameter();
int allready_in_buffer = 0;
int i, ii;
int with_searchpattern = 0;
if(search_pattern != NULL) {
if(search_pattern[0] != '\0')
with_searchpattern = 1;
}
for(i = 0; i < entrys; i++) {
if(i == 0)
nickname = users[index]->GetFirstElement();
else
nickname = users[index]->GetNextElement();
if(!nickname) { /* end reached */
if(tmp_names[0] != '\0') {
Classes.MsgDB->SetIrcChatMessage(active_channel, DISPLAY_USERLIST, tmp_names);
}
break;
}
if(with_searchpattern) {
if(!does_match_case_insensitive(nickname, search_pattern)) {
goto dont_display;
}
}
num_spaces = NICKNAME_LEN - strlen(nickname);
if(num_spaces < 1) num_spaces = 1;
strncat(tmp_names, nickname, NICKNAME_LEN);
allready_in_buffer++;
if(allready_in_buffer < num_users_on_one_line) {
for(ii = 0; ii < num_spaces; ii++)
{
strcat(tmp_names, " ");
}
}
dont_display:
if(((allready_in_buffer) == num_users_on_one_line) || (i == (entrys-1))) {
Classes.MsgDB->SetIrcChatMessage(active_channel, DISPLAY_USERLIST, tmp_names);
tmp_names[0] = '\0';
allready_in_buffer = 0;
}
}
}
#undef _USERDB_CC_
syntax highlighted by Code2HTML, v. 0.9.1