1 /***************************************************************************
2 * Copyright (C) 2005-07 by the Quassel IRC Team *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "ircchannel.h"
23 #include "networkinfo.h"
24 //#include "nicktreemodel.h"
25 #include "signalproxy.h"
28 #include <QMapIterator>
29 #include <QHashIterator>
34 IrcChannel::IrcChannel(const QString &channelname, NetworkInfo *networkinfo)
35 : QObject(networkinfo),
39 networkInfo(networkinfo)
41 setObjectName(QString::number(networkInfo->networkId()) + "/" + channelname);
44 IrcChannel::~IrcChannel() {
48 // ====================
50 // ====================
51 bool IrcChannel::isKnownUser(IrcUser *ircuser) const {
53 qWarning() << "Channel" << name() << "received IrcUser Nullpointer!";
57 if(!_userModes.contains(ircuser)) {
58 qWarning() << "Channel" << name() << "received data for unknown User" << ircuser->nick();
65 bool IrcChannel::isValidChannelUserMode(const QString &mode) const {
68 qWarning() << "Channel" << name() << "received Channel User Mode which is longer then 1 Char:" << mode;
74 bool IrcChannel::initialized() const {
78 QString IrcChannel::name() const {
82 QString IrcChannel::topic() const {
86 QList<IrcUser *> IrcChannel::ircUsers() const {
87 return _userModes.keys();
90 QString IrcChannel::userModes(IrcUser *ircuser) const {
91 if(_userModes.contains(ircuser))
92 return _userModes[ircuser];
97 QString IrcChannel::userModes(const QString &nick) const {
98 return userModes(networkInfo->ircUser(nick));
101 // ====================
103 // ====================
104 void IrcChannel::setTopic(const QString &topic) {
106 emit topicSet(topic);
109 void IrcChannel::join(IrcUser *ircuser) {
110 if(!_userModes.contains(ircuser) && ircuser) {
111 _userModes[ircuser] = QString();
112 ircuser->joinChannel(name());
113 //qDebug() << "JOIN" << name() << ircuser->nick() << ircUsers().count();
114 connect(ircuser, SIGNAL(nickSet(QString)), this, SLOT(ircUserNickSet(QString)));
115 connect(ircuser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed()));
116 // if you wonder why there is no counterpart to ircUserJoined:
117 // the joines are propagted by the ircuser. the signal ircUserJoined is only for convenience
118 emit ircUserJoined(ircuser);
122 void IrcChannel::join(const QString &nick) {
123 join(networkInfo->ircUser(nick));
126 void IrcChannel::part(IrcUser *ircuser) {
127 if(isKnownUser(ircuser)) {
128 _userModes.remove(ircuser);
129 ircuser->partChannel(name());
130 //qDebug() << "PART" << name() << ircuser->nick() << ircUsers().count();
131 // if you wonder why there is no counterpart to ircUserParted:
132 // the joines are propagted by the ircuser. the signal ircUserParted is only for convenience
133 emit ircUserParted(ircuser);
137 void IrcChannel::part(const QString &nick) {
138 part(networkInfo->ircUser(nick));
142 void IrcChannel::setUserModes(IrcUser *ircuser, const QString &modes) {
143 if(isKnownUser(ircuser)) {
144 _userModes[ircuser] = modes;
145 emit userModesSet(ircuser->nick(), modes);
146 emit ircUserModesSet(ircuser, modes);
150 void IrcChannel::setUserModes(const QString &nick, const QString &modes) {
151 setUserModes(networkInfo->ircUser(nick), modes);
155 void IrcChannel::addUserMode(IrcUser *ircuser, const QString &mode) {
156 if(!isKnownUser(ircuser) || !isValidChannelUserMode(mode))
159 if(!_userModes[ircuser].contains(mode)) {
160 _userModes[ircuser] += mode;
161 emit userModeAdded(ircuser->nick(), mode);
162 emit ircUserModeAdded(ircuser, mode);
167 void IrcChannel::addUserMode(const QString &nick, const QString &mode) {
168 addUserMode(networkInfo->ircUser(nick), mode);
172 void IrcChannel::removeUserMode(IrcUser *ircuser, const QString &mode) {
173 if(!isKnownUser(ircuser) || !isValidChannelUserMode(mode))
176 if(_userModes[ircuser].contains(mode)) {
177 _userModes[ircuser].remove(mode);
178 emit userModeRemoved(ircuser->nick(), mode);
179 emit ircUserModeRemoved(ircuser, mode);
184 void IrcChannel::removeUserMode(const QString &nick, const QString &mode) {
185 removeUserMode(networkInfo->ircUser(nick), mode);
188 // INIT SET USER MODES
189 QVariantMap IrcChannel::initUserModes() const {
190 QVariantMap usermodes;
191 QHash<IrcUser *, QString>::const_iterator iter = _userModes.constBegin();
192 while(iter != _userModes.constEnd()) {
193 usermodes[iter.key()->nick()] = iter.value();
199 void IrcChannel::initSetUserModes(const QVariantMap &usermodes) {
200 QMapIterator<QString, QVariant> iter(usermodes);
201 while(iter.hasNext()) {
203 setUserModes(iter.key(), iter.value().toString());
207 void IrcChannel::ircUserDestroyed() {
208 IrcUser *ircUser = static_cast<IrcUser *>(sender());
210 _userModes.remove(ircUser);
211 emit ircUserParted(ircUser);
212 //qDebug() << "DEST" << name() << ircUsers().count();
215 void IrcChannel::ircUserNickSet(QString nick) {
216 IrcUser *ircUser = qobject_cast<IrcUser *>(sender());
218 emit ircUserNickSet(ircUser, nick);
221 void IrcChannel::setInitialized() {