You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/ui/kvi_channel.h

315 lines
15 KiB

#ifndef _KVI_CHANNEL_H_
#define _KVI_CHANNEL_H_
//=============================================================================
//
// File : kvi_channel.h
// Creation date : Tue Aug 1 2000 01:42:00 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2000-2004 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#include "kvi_settings.h"
#include "kvi_console.h"
#include "kvi_window.h"
#include "kvi_string.h"
#include "kvi_ircuserdb.h"
#include "kvi_pixmap.h"
#include "kvi_userlistview.h"
#include "kvi_time.h"
#include "kvi_modew.h"
#include "kvi_valuelist.h"
#include <tqdatetime.h>
#include "kvi_pointerhashtable.h"
#include <tqstringlist.h>
class KviConsole;
class TQSplitter;
class TQToolButton;
class KviTopicWidget;
class KviIrcMask;
class KviThemedLabel;
class KviTalHBox;
#ifdef COMPILE_ON_WINDOWS
// windows compiler wants this instead of the forward decl
#include "kvi_maskeditor.h"
#else
typedef struct _KviMaskEntry KviMaskEntry; // kvi_maskeditor.h
#endif
class KviMaskEditor;
class KviModeEditor;
#define KVI_CHANNEL_STATE_HAVEALLNAMES 1
#define KVI_CHANNEL_STATE_HAVEBANLIST (1 << 1)
#define KVI_CHANNEL_STATE_HAVEWHOLIST (1 << 2)
#define KVI_CHANNEL_STATE_HAVEBANEXCEPTIONLIST (1 << 3)
#define KVI_CHANNEL_STATE_HAVEINVITELIST (1 << 4)
#define KVI_CHANNEL_STATE_DEADCHAN (1 << 5)
#define KVI_CHANNEL_STATE_SENTBANLISTREQUEST (1 << 6)
#define KVI_CHANNEL_STATE_SENTBANEXCEPTIONLISTREQUEST (1 << 7)
#define KVI_CHANNEL_STATE_SENTINVITELISTREQUEST (1 << 8)
#define KVI_CHANNEL_STATE_SENTWHOREQUEST (1 << 9)
#define KVI_CHANNEL_STATE_SENTPART (1 << 10)
#define KVI_CHANNEL_STATE_SYNCHRONIZED (1 << 11)
#define KVI_CHANNEL_STATE_NOCLOSEONPART (1 << 12)
#define KVI_CHANNEL_STATE_SENTSYNCWHOREQUEST (1 << 13)
typedef struct _KviChannelAction
{
TQString szNick; // action source nick
unsigned int uActionType; // type of the action
kvi_time_t tTime; // time of the action
int iTemperature; // temperature of the action
} KviChannelAction;
// this is the maximum count of actions that we keep in memory
#define KVI_CHANNEL_ACTION_HISTORY_MAX_COUNT 40
// this is the timespan of the oldest action that we keep in memory
// 600 secs = 10 mins
#define KVI_CHANNEL_ACTION_HISTORY_MAX_TIMESPAN 600
typedef struct _KviChannelActivityStats
{
unsigned int uActionCount; // number of actions in the history
bool bStatsInaccurate; // the stats are inaccurate because we have just joined the chan
unsigned int uLastActionTimeSpan; // the timespan between the last action and now
unsigned int uFirstActionTimeSpan; // the time span between the first and the last action
double dActionsPerMinute; // average number of actions per minute in the lastActionTimeSpan
unsigned int uActionsInTheLastMinute; // number of actions in the last minute
int iAverageActionTemperature; // the average chan temperature
unsigned int uHotActionCount;
unsigned int uHotActionPercent;
TQStringList lTalkingUsers; // users that seem to be talking NOW
TQStringList lWereTalkingUsers;
} KviChannelActivityStats;
class KVIRC_API KviChannel : public KviWindow
{
Q_OBJECT
TQ_OBJECT
public:
KviChannel(KviFrame * lpFrm,KviConsole * lpConsole,const char * name);
~KviChannel();
protected:
TQSplitter * m_pTopSplitter;
TQSplitter * m_pVertSplitter;
BUTTON_CLASS * m_pDoubleViewButton;
KviWindowToolPageButton * m_pListViewButton;
KviWindowToolPageButton * m_pBanEditorButton;
KviWindowToolPageButton * m_pBanExceptionEditorButton;
KviWindowToolPageButton * m_pInviteEditorButton;
KviWindowToolPageButton * m_pModeEditorButton;
KviMaskEditor * m_pBanEditor;
KviMaskEditor * m_pBanExceptionEditor;
KviMaskEditor * m_pInviteEditor;
KviModeEditor * m_pModeEditor;
KviIrcView * m_pMessageView;
KviTopicWidget * m_pTopicWidget;
KviUserListView * m_pUserListView;
KviModeWidget * m_pModeWidget;
int m_iStateFlags;
TQString m_szChannelMode;
TQString m_szChannelKey;
KviStr m_szChannelLimit;
KviPointerList<KviMaskEntry> * m_pBanList;
KviPointerList<KviMaskEntry> * m_pBanExceptionList;
KviPointerList<KviMaskEntry> * m_pInviteList;
KviPixmap m_privateBackground;
TQDateTime m_joinTime;
TQString m_szNameWithUserFlag;
KviPointerHashTable<const char *,TQString> * m_pTmpHighLighted;
unsigned int m_uActionHistoryHotActionCount;
KviPointerList<KviChannelAction> * m_pActionHistory;
kvi_time_t m_tLastReceivedWhoReply;
KviValueList<int> m_VertSplitterSizesList;
KviTalHBox * m_pButtonContainer;
protected:
bool eventFilter(TQObject *, TQEvent *);
virtual TQPixmap * myIconPtr();
virtual void fillCaptionBuffers();
virtual void resizeEvent(TQResizeEvent *e);
virtual void closeEvent(TQCloseEvent *e);
// virtual void fillContextPopup(KviTalPopupMenu * p);
virtual void getConfigGroupName(TQString &buf);
virtual void saveProperties(KviConfig * cfg);
virtual void loadProperties(KviConfig * cfg);
virtual void applyOptions();
virtual void getBaseLogFileName(TQString &buffer);
virtual void triggerCreationEvents();
void toggleEditor(KviMaskEditor ** ppEd,KviWindowToolPageButton ** ppBtn,KviPointerList<KviMaskEntry> *l,char flag,const char *edName);
void internalMask(const TQString &mask,bool bAdd,const TQString &setBy,unsigned int setAt,KviPointerList<KviMaskEntry> *l,KviMaskEditor **ppEd);
void checkChannelSync();
void showDoubleView(bool bShow);
void fixActionHistory();
void getTalkingUsersStats(TQString &buffer,TQStringList &l,bool bPast);
public:
void getChannelActivityStats(KviChannelActivityStats * s);
//void getChannelActivityStatsDescription(TQString &buffer);
KviPointerList<KviMaskEntry> * banList(){ return m_pBanList; };
KviPointerList<KviMaskEntry> * banExceptionList(){ return m_pBanExceptionList; };
KviPointerList<KviMaskEntry> * inviteList(){ return m_pInviteList; };
TQString * firstSelectedNickname(){ return m_pUserListView->firstSelectedNickname(); };
TQString * nextSelectedNickname(){ return m_pUserListView->nextSelectedNickname(); };
int selectedCount(){ return m_pUserListView->selectedCount(); };
int opCount(){ return m_pUserListView->opCount(); };
int voiceCount(){ return m_pUserListView->voiceCount(); };
int halfOpCount(){ return m_pUserListView->halfOpCount(); };
int userOpCount(){ return m_pUserListView->userOpCount(); };
int chanAdminCount(){ return m_pUserListView->chanAdminCount(); };
int chanOwnerCount(){ return m_pUserListView->chanOwnerCount(); };
unsigned int count(){ return m_pUserListView->count(); };
unsigned int banCount(){ return m_pBanList->count(); };
unsigned int banExceptionCount(){ return m_pBanExceptionList->count(); };
unsigned int inviteCount(){ return m_pInviteList->count(); };
const TQString & nameWithUserFlag(){ return m_szNameWithUserFlag; };
virtual const TQString & target(){ return windowName(); };
// void appendSelectedNicknames(KviStr &buffer);
void setMask(char flag, const TQString &mask,bool bAdd,const TQString &setBy,unsigned int setAt);
kvi_time_t lastReceivedWhoReply(){ return m_tLastReceivedWhoReply; };
void setLastReceivedWhoReply(kvi_time_t tTime){ m_tLastReceivedWhoReply = tTime; };
void setSentSyncWhoRequest(){ m_iStateFlags |= KVI_CHANNEL_STATE_SENTSYNCWHOREQUEST; };
void clearSentSyncWhoRequest(){ m_iStateFlags ^= KVI_CHANNEL_STATE_SENTSYNCWHOREQUEST; };
bool sentSyncWhoRequest(){ return (m_iStateFlags & KVI_CHANNEL_STATE_SENTSYNCWHOREQUEST); };
bool sentWhoRequest(){ return (m_iStateFlags & KVI_CHANNEL_STATE_SENTWHOREQUEST); };
void setSentWhoRequest(){ m_iStateFlags |= KVI_CHANNEL_STATE_SENTWHOREQUEST; };
bool sentInviteListRequest(){ return (m_iStateFlags & KVI_CHANNEL_STATE_SENTINVITELISTREQUEST); };
void setSentInviteListRequest(){ m_iStateFlags |= KVI_CHANNEL_STATE_SENTINVITELISTREQUEST; };
void setInviteListDone(){ m_iStateFlags ^= KVI_CHANNEL_STATE_SENTINVITELISTREQUEST; };
bool sentBanListRequest(){ return (m_iStateFlags & KVI_CHANNEL_STATE_SENTBANLISTREQUEST); };
void setSentBanListRequest(){ m_iStateFlags |= KVI_CHANNEL_STATE_SENTBANLISTREQUEST; };
void setBanListDone(){ m_iStateFlags ^= KVI_CHANNEL_STATE_SENTBANLISTREQUEST; };
bool sentBanExceptionListRequest(){ return (m_iStateFlags & KVI_CHANNEL_STATE_SENTBANEXCEPTIONLISTREQUEST); };
void setSentBanExceptionListRequest(){ m_iStateFlags |= KVI_CHANNEL_STATE_SENTBANEXCEPTIONLISTREQUEST; };
void setBanExceptionListDone(){ m_iStateFlags ^= KVI_CHANNEL_STATE_SENTBANEXCEPTIONLISTREQUEST; };
bool hasAllNames(){ return (m_iStateFlags & KVI_CHANNEL_STATE_HAVEALLNAMES); };
void setHasAllNames(){ m_iStateFlags |= KVI_CHANNEL_STATE_HAVEALLNAMES; checkChannelSync(); };
bool hasInviteList(){ return (m_iStateFlags & KVI_CHANNEL_STATE_HAVEINVITELIST); checkChannelSync(); };
void setHasInviteList(){ m_iStateFlags |= KVI_CHANNEL_STATE_HAVEINVITELIST; };
bool hasWhoList(){ return (m_iStateFlags & KVI_CHANNEL_STATE_HAVEWHOLIST); };
void setHasWhoList(){ m_iStateFlags |= KVI_CHANNEL_STATE_HAVEWHOLIST; checkChannelSync(); };
bool hasBanList(){ return (m_iStateFlags & KVI_CHANNEL_STATE_HAVEBANLIST); };
void setHasBanList(){ m_iStateFlags |= KVI_CHANNEL_STATE_HAVEBANLIST; checkChannelSync(); };
bool hasBanExceptionList(){ return (m_iStateFlags & KVI_CHANNEL_STATE_HAVEBANEXCEPTIONLIST); };
void setHasBanExceptionList(){ m_iStateFlags |= KVI_CHANNEL_STATE_HAVEBANEXCEPTIONLIST; checkChannelSync(); };
bool closeOnPart(){ return !(m_iStateFlags & KVI_CHANNEL_STATE_NOCLOSEONPART); };
void partMessageSent(bool bCloseOnPart = true,bool bShowMessage = true);
virtual bool activityMeter(unsigned int * puActivityValue,unsigned int * puActivityTemperature);
void setDeadChan();
void setAliveChan();
void prependUserFlag(const TQString &nick,TQString &buffer){ m_pUserListView->prependUserFlag(nick,buffer); };
char getUserFlag(const TQString &nick){ return m_pUserListView->getUserFlag(nick); };
bool isDeadChan(){ return (m_iStateFlags & KVI_CHANNEL_STATE_DEADCHAN); };
virtual TQSize sizeHint() const;
void enableUserListUpdates(bool bEnable){ m_pUserListView->enableUpdates(bEnable); };
KviUserListEntry * join(const TQString &nick,const TQString &user = TQString(),const TQString &host = TQString(),int iFlags = 0)
{ return m_pUserListView->join(nick,user,host,iFlags); };
bool op(const TQString &nick,bool bOp){ return m_pUserListView->op(nick,bOp); };
bool avatarChanged(const TQString &nick){ return m_pUserListView->avatarChanged(nick); };
bool voice(const TQString &nick,bool bVoice){ return m_pUserListView->voice(nick,bVoice); };
bool halfop(const TQString &nick,bool bHalfOp){ return m_pUserListView->halfop(nick,bHalfOp); };
bool userop(const TQString &nick,bool bUserOp){ return m_pUserListView->userop(nick,bUserOp); };
bool setChanOwner(const TQString &nick,bool bChanOwner){ return m_pUserListView->setChanOwner(nick,bChanOwner); };
bool setChanAdmin(const TQString &nick,bool bChanAdmin){ return m_pUserListView->setChanAdmin(nick,bChanAdmin); };
void userAction(KviIrcMask * user,unsigned int uActionType);
void userAction(const TQString &nick,unsigned int uActionType);
void userAction(const TQString &nick,const TQString &user,const TQString &host,unsigned int uActionType);
bool nickChange(const TQString &oldNick,const TQString &newNick);
void channelAction(const TQString &nick,unsigned int uActionType,int iTemperature);
bool part(const TQString &nick);
bool isOn(const TQString &nick){ return (m_pUserListView->findEntry(nick) != 0); };
KviUserListEntry * findEntry(const TQString &nick){ return m_pUserListView->findEntry(nick); };
KviUserListView * userListView(){ return m_pUserListView; };
bool isMeOp(bool bAtLeast = false);
bool isMeChanOwner(bool bAtLeast = false);
bool isMeChanAdmin(bool bAtLeast = false);
bool isMeVoice(bool bAtLeast = false);
bool isMeHalfOp(bool bAtLeast = false);
bool isMeUserOp(bool bAtLeast = false);
bool isOp(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isOp(nick,bAtLeast); };
bool isVoice(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isVoice(nick,bAtLeast); };
bool isHalfOp(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isHalfOp(nick,bAtLeast); };
bool isUserOp(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isUserOp(nick,bAtLeast); };
bool isChanOwner(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isChanOwner(nick,bAtLeast); };
bool isChanAdmin(const TQString &nick,bool bAtLeast = false){ return m_pUserListView->isChanAdmin(nick,bAtLeast); };
int myFlags();
void updateModeLabel();
KviTopicWidget * topicWidget(){ return m_pTopicWidget; };
virtual void outputMessage(int msg_type,const TQString &msg);
void ownMessage(const TQString &buffer);
void ownAction(const TQString &buffer);
void setChannelMode(char mode,bool bAdd);
void setChannelKey(const char * key);
void setChannelLimit(const char * limit);
void getChannelModeString(TQString &buffer);
KviStr & channelLimit(){ return m_szChannelLimit; };
bool hasChannelLimit(){ return m_szChannelLimit.hasData(); };
bool hasChannelKey() { return !m_szChannelKey.isEmpty(); };
TQString & channelKey(){ return m_szChannelKey; };
void addHighlightedUser(const char * nick);
void removeHighlightedUser(const char * nick);
bool isHighlightedUser(const char * nick) { return m_pTmpHighLighted->find(nick); };
KviIrcView * messageView() const { return m_pMessageView; };
virtual void lostUserFocus();
virtual void getTaskBarTipText(TQString &buffer);
TQString channelMode() { return m_szChannelMode; };
void unhighlight();
TQFrame * buttonContainer() { return (TQFrame*)m_pButtonContainer; };
private slots:
void toggleDoubleView();
void toggleListView();
void toggleBanEditor();
void toggleBanExceptionEditor();
void toggleInviteEditor();
void toggleModeEditor();
void topicSelected(const TQString & topic);
void setMode(const char * mode);
void modeSelectorDone();
void textViewRightClicked();
void removeMasks(KviMaskEditor *ed,KviPointerList<KviMaskEntry> *l);
void toggleToolButtons();
protected:
virtual void preprocessMessage(TQString & szMessage);
};
#endif //_KVI_CHANNEL_H_