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