1 /*
2 * %kadu copyright begin%
3 * Copyright 2012 Wojciech Treter (juzefwt@gmail.com)
4 * Copyright 2011, 2012, 2013, 2014 Bartosz Brachaczek (b.brachaczek@gmail.com)
5 * Copyright 2011, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
6 * %kadu copyright end%
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include "autoaway.h"
23
24 #include "plugins/idle/idle-plugin-object.h"
25 #include "plugins/idle/idle.h"
26
27 #include "accounts/account.h"
28 #include "configuration/configuration.h"
29 #include "configuration/deprecated-configuration-api.h"
30 #include "configuration/gui/configuration-ui-handler-repository.h"
31 #include "core/myself.h"
32 #include "gui/widgets/configuration/configuration-widget.h"
33 #include "gui/windows/main-configuration-window.h"
34 #include "misc/paths-provider.h"
35 #include "parser/parser.h"
36 #include "status/status-changer-manager.h"
37 #include "debug.h"
38
39 #include <QtWidgets/QApplication>
40 #include <QtWidgets/QCheckBox>
41 #include <QtWidgets/QLineEdit>
42 #include <QtWidgets/QLineEdit>
43 #include <QtWidgets/QSpinBox>
44
45 /**
46 * @ingroup autoaway
47 * @{
48 */
49
Autoaway(QObject * parent)50 Autoaway::Autoaway(QObject *parent) :
51 QObject{parent},
52 m_checkInterval{},
53 m_autoAwayTime{},
54 m_autoExtendedAwayTime{},
55 m_autoDisconnectTime{},
56 m_autoInvisibleTime{},
57 m_autoAwayEnabled{},
58 m_autoExtendedAwayEnabled{},
59 m_autoInvisibleEnabled{},
60 m_autoDisconnectEnabled{},
61 m_parseAutoStatus{},
62 m_statusChanged{false},
63 m_idleTime{},
64 m_refreshStatusTime{},
65 m_refreshStatusInterval{},
66 m_changeTo{AutoawayStatusChanger::NoChangeDescription}
67 {
68 m_timer = make_owned<QTimer>(this);
69 m_timer->setSingleShot(true);
70 connect(m_timer.get(), SIGNAL(timeout()), this, SLOT(checkIdleTime()));
71 }
72
~Autoaway()73 Autoaway::~Autoaway()
74 {
75 }
76
setAutoawayStatusChanger(AutoawayStatusChanger * autoawayStatusChanger)77 void Autoaway::setAutoawayStatusChanger(AutoawayStatusChanger *autoawayStatusChanger)
78 {
79 m_autoawayStatusChanger = autoawayStatusChanger;
80 }
81
setConfiguration(Configuration * configuration)82 void Autoaway::setConfiguration(Configuration *configuration)
83 {
84 m_configuration = configuration;
85 }
86
setIdle(Idle * idle)87 void Autoaway::setIdle(Idle *idle)
88 {
89 m_idle = idle;
90 }
91
setMyself(Myself * myself)92 void Autoaway::setMyself(Myself *myself)
93 {
94 m_myself = myself;
95 }
96
setParser(Parser * parser)97 void Autoaway::setParser(Parser *parser)
98 {
99 m_parser = parser;
100 }
101
init()102 void Autoaway::init()
103 {
104 createDefaultConfiguration();
105 configurationUpdated();
106 }
107
changeStatusTo()108 AutoawayStatusChanger::ChangeStatusTo Autoaway::changeStatusTo()
109 {
110 m_idleTime = m_idle->secondsIdle();
111
112 if (m_idleTime >= m_autoDisconnectTime && m_autoDisconnectEnabled)
113 return AutoawayStatusChanger::ChangeStatusToOffline;
114 else if (m_idleTime >= m_autoInvisibleTime && m_autoInvisibleEnabled)
115 return AutoawayStatusChanger::ChangeStatusToInvisible;
116 else if (m_idleTime >= m_autoExtendedAwayTime && m_autoExtendedAwayEnabled)
117 return AutoawayStatusChanger::ChangeStatusToExtendedAway;
118 else if (m_idleTime >= m_autoAwayTime && m_autoAwayEnabled)
119 return AutoawayStatusChanger::ChangeStatusToAway;
120 else
121 return AutoawayStatusChanger::NoChangeStatus;
122 }
123
changeDescriptionTo()124 AutoawayStatusChanger::ChangeDescriptionTo Autoaway::changeDescriptionTo()
125 {
126 AutoawayStatusChanger::ChangeStatusTo currentChangeStatusTo = changeStatusTo();
127 if (AutoawayStatusChanger::NoChangeStatus == currentChangeStatusTo)
128 return AutoawayStatusChanger::NoChangeDescription;
129
130 return m_changeTo;
131 }
132
descriptionAddon() const133 QString Autoaway::descriptionAddon() const
134 {
135 return m_descriptionAddon;
136 }
137
checkIdleTime()138 void Autoaway::checkIdleTime()
139 {
140 kdebugf();
141
142 m_idleTime = m_idle->secondsIdle();
143
144 if (m_refreshStatusInterval > 0 && m_idleTime >= m_refreshStatusTime)
145 {
146 m_descriptionAddon = parseDescription(m_autoStatusText);
147 m_refreshStatusTime = m_idleTime + m_refreshStatusInterval;
148 }
149
150 if (changeStatusTo() != AutoawayStatusChanger::NoChangeStatus)
151 {
152 m_autoawayStatusChanger->update();
153 m_statusChanged = true;
154 }
155 else if (m_statusChanged)
156 {
157 m_statusChanged = false;
158 m_autoawayStatusChanger->update();
159 }
160
161 m_timer->setInterval(m_checkInterval * 1000);
162 m_timer->setSingleShot(true);
163 m_timer->start();
164
165 kdebugf2();
166 }
167
changeDescription(const QString & oldDescription)168 QString Autoaway::changeDescription(const QString& oldDescription)
169 {
170 return oldDescription;
171 }
172
configurationUpdated()173 void Autoaway::configurationUpdated()
174 {
175 if (!m_configuration)
176 return;
177
178 m_checkInterval = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoAwayCheckTime");
179 m_refreshStatusTime = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoRefreshStatusTime");
180 m_autoAwayTime = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoAwayTimeMinutes")*60;
181 m_autoExtendedAwayTime = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoExtendedAwayTimeMinutes")*60;
182 m_autoDisconnectTime = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoDisconnectTimeMinutes")*60;
183 m_autoInvisibleTime = m_configuration->deprecatedApi()->readUnsignedNumEntry("General","AutoInvisibleTimeMinutes")*60;
184
185 m_autoAwayEnabled = m_configuration->deprecatedApi()->readBoolEntry("General","AutoAway");
186 m_autoExtendedAwayEnabled = m_configuration->deprecatedApi()->readBoolEntry("General","AutoExtendedAway");
187 m_autoInvisibleEnabled = m_configuration->deprecatedApi()->readBoolEntry("General","AutoInvisible");
188 m_autoDisconnectEnabled = m_configuration->deprecatedApi()->readBoolEntry("General","AutoDisconnect");
189 m_parseAutoStatus = m_configuration->deprecatedApi()->readBoolEntry("General", "ParseStatus");
190
191 m_refreshStatusInterval = m_refreshStatusTime;
192
193 m_autoStatusText = m_configuration->deprecatedApi()->readEntry("General", "AutoStatusText");
194 m_descriptionAddon = parseDescription(m_autoStatusText);
195
196 m_changeTo = (AutoawayStatusChanger::ChangeDescriptionTo)m_configuration->deprecatedApi()->readNumEntry("General", "AutoChangeDescription");
197
198 m_autoawayStatusChanger->update();
199
200 if (m_autoAwayEnabled || m_autoExtendedAwayEnabled || m_autoInvisibleEnabled || m_autoDisconnectEnabled)
201 {
202 m_timer->setInterval(m_checkInterval * 1000);
203 m_timer->setSingleShot(true);
204 m_timer->start();
205 }
206 else
207 m_timer->stop();
208 }
209
parseDescription(const QString & parseDescription)210 QString Autoaway::parseDescription(const QString &parseDescription)
211 {
212 if (m_parseAutoStatus)
213 return (m_parser->parse(parseDescription, Talkable(m_myself->buddy()), ParserEscape::HtmlEscape));
214 else
215 return parseDescription;
216 }
217
denominatedInverval(Configuration * configuration,const QString & name,unsigned int def)218 static int denominatedInverval(Configuration *configuration, const QString &name, unsigned int def)
219 {
220 int ret = configuration->deprecatedApi()->readUnsignedNumEntry("General", name, def * 60);
221 // This AutoawayTimesDenominated thing was living shortly in 1.0-git.
222 return configuration->deprecatedApi()->readBoolEntry("General", "AutoawayTimesDenominated", false)
223 ? ret
224 : (ret + 59) / 60;
225 }
226
createDefaultConfiguration()227 void Autoaway::createDefaultConfiguration()
228 {
229 m_configuration->deprecatedApi()->addVariable("General", "Autoaway", true);
230 m_configuration->deprecatedApi()->addVariable("General", "AutoawayCheckTime", 10);
231 m_configuration->deprecatedApi()->addVariable("General", "AutoawayTimeMinutes", denominatedInverval(m_configuration, "AutoawayTime", 5));
232 m_configuration->deprecatedApi()->addVariable("General", "AutoExtendedAway", true);
233 m_configuration->deprecatedApi()->addVariable("General", "AutoExtendedAwayTimeMinutes", denominatedInverval(m_configuration, "AutoExtendedAwayTime", 15));
234 m_configuration->deprecatedApi()->addVariable("General", "AutoChangeDescription", 0);
235 m_configuration->deprecatedApi()->addVariable("General", "AutoDisconnect", false);
236 m_configuration->deprecatedApi()->addVariable("General", "AutoDisconnectTimeMinutes", denominatedInverval(m_configuration, "AutoDisconnectTime", 60));
237 m_configuration->deprecatedApi()->addVariable("General", "AutoInvisible", false);
238 m_configuration->deprecatedApi()->addVariable("General", "AutoInvisibleTimeMinutes", denominatedInverval(m_configuration, "AutoInvisibleTime", 30));
239 m_configuration->deprecatedApi()->addVariable("General", "AutoRefreshStatusTime", 0);
240 m_configuration->deprecatedApi()->addVariable("General", "AutoStatusText", QString());
241
242 // AutoawayCheckTime has been mistakenly denominated in 1.0-git.
243 if (0 == m_configuration->deprecatedApi()->readUnsignedNumEntry("General", "AutoawayCheckTime"))
244 m_configuration->deprecatedApi()->writeEntry("General", "AutoawayCheckTime", 10);
245 }
246
247 /** @} */
248
249 #include "moc_autoaway.cpp"
250