Drop some more data from Channel on disconnect.
[konversation:konversation.git] / src / irc / channelnick.cpp
1 /*
2   This program is free software; you can redistribute it and/or modify
3   it under the terms of the GNU General Public License as published by
4   the Free Software Foundation; either version 2 of the License, or
5   (at your option) any later version.
6 */
7
8 /*
9   begin:     Wed Aug 04 2004
10   copyright: (C) 2002,2003,2004 by Dario Abatianni
11   email:     eisfuchs@tigress.com
12 */
13
14 /* An instance of ChannelNick is made for each nick in each channel.
15    So for a person in multiple channels, they will have one NickInfo, and multiple ChannelNicks.
16    It contains a pointer to the NickInfo, and the mode of that person in the channel.
17 */
18
19 #include "channelnick.h"
20 #include "channel.h"
21 #include "server.h"
22
23
24 ChannelNick::ChannelNick(const NickInfoPtr& nickInfo, const QString& channel)
25 : KShared()
26 {
27     m_nickInfo = nickInfo;
28     m_isop = false;
29     m_isadmin = false;
30     m_isowner = false;
31     m_ishalfop = false;
32     m_hasvoice = false;
33     m_timeStamp = 0;
34     m_recentActivity = 0;
35     m_channel = channel;
36     m_isChanged = false;
37 }
38
39 ChannelNick::~ChannelNick()
40 {
41     kDebug() << "Nick" << getNickname() << "going down";
42 }
43
44 bool ChannelNick::isOp() const
45 {
46   return m_isop;
47 }
48
49 bool ChannelNick::isAdmin() const
50 {
51   return m_isadmin;
52 }
53
54 bool ChannelNick::isOwner() const
55 {
56   return m_isowner;
57 }
58
59 bool ChannelNick::isHalfOp() const
60 {
61   return m_ishalfop;
62 }
63
64 bool ChannelNick::hasVoice() const
65 {
66   return m_hasvoice;
67 }
68
69 bool ChannelNick::isAnyTypeOfOp() const
70 {
71   return m_isop || m_isadmin || m_isowner || m_ishalfop;
72 }
73
74 NickInfoPtr ChannelNick::getNickInfo() const
75 {
76   return m_nickInfo;
77 }
78
79 /** @param mode 'v' to set voice, 'a' to set admin, 'h' to set halfop, 'o' to set op.
80  *  @param state what to set the mode to.
81  */
82 bool ChannelNick::setMode(char mode, bool state)
83 {
84     switch (mode)
85     {
86         case 'q':
87             return setOwner(state);
88         case 'a':
89             return setAdmin(state);
90         case 'o':
91             return setOp(state);
92         case 'h':
93             return setHalfOp(state);
94         case 'v':
95             return setVoice(state);
96         default:
97             kDebug() << "Mode '" << mode << "' not recognised in setModeForChannelNick";
98             return false;
99     }
100 }
101
102 /** Used still for passing modes from inputfilter to Server.  Should be removed.
103  */
104 bool ChannelNick::setMode(int mode)
105 {
106     bool voice = mode%2;
107     mode >>= 1;
108     bool halfop = mode %2;
109     mode >>= 1;
110     bool op = mode %2;
111     mode >>= 1;
112     bool owner = mode %2;
113     mode >>= 1;
114     bool admin = mode %2;
115     return setMode(admin, owner, op, halfop, voice);
116 }
117
118 bool ChannelNick::setMode(bool admin,bool owner,bool op,bool halfop,bool voice)
119 {
120     if(m_isadmin==admin && m_isowner==owner && m_isop==op && m_ishalfop==halfop && m_hasvoice==voice)
121         return false;
122     m_isadmin=admin;
123     m_isowner=owner;
124     m_isop=op;
125     m_ishalfop=halfop;
126     m_hasvoice=voice;
127     markAsChanged();
128     return true;
129 }
130
131 /** set the voice for the nick, and update
132  * @returns Whether it needed to be changed.  False for no change.
133  */
134 bool ChannelNick::setVoice(bool state)
135 {
136     if(m_hasvoice==state) return false;
137     m_hasvoice=state;
138     markAsChanged();
139     return true;
140 }
141
142 bool ChannelNick::setOwner(bool state)
143 {
144     if(m_isowner==state) return false;
145     m_isowner=state;
146     markAsChanged();
147     return true;
148 }
149
150 bool ChannelNick::setAdmin(bool state)
151 {
152     if(m_isadmin==state) return false;
153     m_isadmin=state;
154     markAsChanged();
155     return true;
156 }
157
158 bool ChannelNick::setHalfOp(bool state)
159 {
160     if(m_ishalfop==state) return false;
161     m_ishalfop=state;
162     markAsChanged();
163     return true;
164 }
165
166 bool ChannelNick::setOp(bool state)
167 {
168     if(m_isop==state) return false;
169     m_isop=state;
170     markAsChanged();
171     return true;
172 }
173
174 //Purely provided for convience because they are used so often.
175 //Just calls nickInfo->getNickname() etc
176 QString ChannelNick::getNickname() const
177 {
178     return m_nickInfo->getNickname();
179 }
180
181 QString ChannelNick::getHostmask() const
182 {
183     return m_nickInfo->getHostmask();
184 }
185
186 QString ChannelNick::tooltip() const
187 {
188     //  if(addressee.isEmpty()) return QString();
189     //KABC::Addressee addressee = nickInfo->getAddressee();
190     QString strTooltip;
191     QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
192
193     tooltip << "<qt>";
194
195     tooltip << "<table cellspacing=\"0\" cellpadding=\"0\">";
196
197     m_nickInfo->tooltipTableData(tooltip);
198
199     QStringList modes;
200     if(isOp()) modes << i18n("Operator");
201     if(isAdmin()) modes << i18n("Admin");
202     if(isOwner()) modes << i18n("Owner");
203     if(isHalfOp()) modes << i18n("Half-operator");
204     if(hasVoice()) modes << i18n("Has voice");
205     //Don't show anything if the user is just a normal user
206     //if(modes.empty()) modes << i18n("A normal user");
207     if(!modes.empty())
208     {
209         tooltip << "<tr><td><b>" << i18n("Mode") << ": </b></td><td>" << modes.join(", ") << "</td></tr>";
210     }
211     tooltip << "</table></qt>";
212     //kDebug() << strTooltip ;
213     //if(!dirty) return QString();
214     return strTooltip;
215 }
216
217 QString ChannelNick::loweredNickname() const
218 {
219     return m_nickInfo->loweredNickname();
220 }
221
222 uint ChannelNick::timeStamp() const
223 {
224   return m_timeStamp;
225 }
226
227 uint ChannelNick::recentActivity() const
228 {
229     return m_recentActivity;
230 }
231
232 void ChannelNick::moreActive()
233 {
234     m_recentActivity++;
235 }
236
237 void ChannelNick::lessActive()
238 {
239     m_recentActivity--;
240 }
241
242 void ChannelNick::setTimeStamp(uint stamp)
243 {
244   m_timeStamp = stamp;
245 }
246
247 void ChannelNick::markAsChanged()
248 {
249     setChanged(true);
250     m_nickInfo->getServer()->startChannelNickChangedTimer(m_channel);
251 }