Huggle  build:^490^dce1e5c
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
configuration.cpp
1 //This program is free software: you can redistribute it and/or modify
2 //it under the terms of the GNU General Public License as published by
3 //the Free Software Foundation, either version 3 of the License, or
4 //(at your option) any later version.
5 
6 //This program is distributed in the hope that it will be useful,
7 //but WITHOUT ANY WARRANTY; without even the implied warranty of
8 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 //GNU General Public License for more details.
10 
11 #include "configuration.hpp"
12 
13 using namespace Huggle;
14 
15 unsigned int Configuration::Verbosity = 0;
16 WikiSite Configuration::Project("enwiki", "en.wikipedia.org/", "wiki/", "w/", true, true, "#en.wikipedia", "en");
17 bool Configuration::UsingSSL = true;
18 QString Configuration::UserName = "User";
19 QString Configuration::Password = "";
20 QString Configuration::WelcomeMP = "Project:Huggle/Message";
21 QList<WikiSite *> Configuration::ProjectList;
22 //! This is a consumer key for "huggle" on wmf wikis
23 QString Configuration::WmfOAuthConsumerKey = "56a6d6de895e3b859faa57b677f6cd21";
25 #ifdef PYTHONENGINE
26 bool Configuration::PythonEngine = true;
27 #else
28 bool Configuration::PythonEngine = false;
29 #endif
30 bool Configuration::Restricted = false;
31 bool Configuration::UsingIRC = true;
32 QString Configuration::IRCIdent = "huggle";
33 QString Configuration::IRCServer = "irc.wikimedia.org";
34 QString Configuration::IRCNick = "huggle";
35 quint16 Configuration::IRCPort = 6667;
37 QString Configuration::HuggleVersion = HUGGLE_VERSION;
39 QString Configuration::HomePath = QDir::currentPath();
40 QString Configuration::EditSuffixOfHuggle = "([[WP:HG]])";
43 QString Configuration::DefaultRevertSummary = "Reverted edits by $1 identified as vandalism";
44 QStringList Configuration::WhiteList;
45 
46 // Global
47 QString Configuration::GlobalConfigurationWikiAddress = "meta.wikimedia.org/w/";
48 bool Configuration::GlobalConfig_EnableAll = true;
49 QString Configuration::GlobalConfig_MinVersion = HUGGLE_VERSION;
50 QString Configuration::GlobalConfig_LocalConfigWikiPath = "Project:Huggle/Config";
51 QString Configuration::GlobalConfig_DocumentationPath = "https://www.mediawiki.org/wiki/Manual:Huggle";
52 QString Configuration::GlobalConfig_FeedbackPath = "http://en.wikipedia.org/wiki/Wikipedia:Huggle/Feedback";
53 QString Configuration::GlobalConfig_UserConf = "User:$1/huggle.css";
54 
55 // Local
56 
58 bool Configuration::LocalConfig_UseIrc = false;
59 bool Configuration::LocalConfig_RequireRollback = false;
60 bool Configuration::LocalConfig_RequireAdmin = false;
61 bool Configuration::LocalConfig_EnableAll = false;
62 int Configuration::LocalConfig_RequireEdits = 0;
63 
64 // Reverting
65 QString Configuration::LocalConfig_MultipleRevertSummary = "Reverted,edit by,edits by,and,other users,to last revision by,to an older version by";
66 QStringList Configuration::LocalConfig_RevertSummaries;
67 QString Configuration::LocalConfig_RollbackSummary = "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]]) to last revision by $2";
68 QString Configuration::LocalConfig_DefaultSummary = "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]]) to last revision by $2";
69 QString Configuration::LocalConfig_SingleRevert = "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]])";
70 QString Configuration::LocalConfig_UndoSummary = "Undid edit by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]])";
71 QString Configuration::LocalConfig_SoftwareRevertDefaultSummary = "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]]) to last revision by $2 using huggle software rollback (reverted by $3 revisions to revision $4)";
72 
73 // Warnings
74 
75 QString Configuration::LocalConfig_AgfRevert = "Reverted good faith edits";
76 QString Configuration::LocalConfig_WarnSummary = "Warning (level 1)";
77 QString Configuration::LocalConfig_WarnSummary2 = "Warning (level 2)";
78 QString Configuration::LocalConfig_WarnSummary3 = "Warning (level 3)";
79 QString Configuration::LocalConfig_WarnSummary4 = "Warning (level 4)";
80 
81 QStringList Configuration::LocalConfig_Assisted;
82 QStringList Configuration::LocalConfig_Ignores;
83 QStringList Configuration::LocalConfig_RevertPatterns;
84 QStringList Configuration::LocalConfig_IgnorePatterns;
85 QStringList Configuration::LocalConfig_WarningTypes;
86 QStringList Configuration::Rights;
87 
88 QStringList Configuration::LocalConfig_WarningDefs;
89 
92 
93 QStringList Configuration::LocalConfig_WarningTemplates;
94 
95 int Configuration::LocalConfig_IPScore = 800;
96 int Configuration::LocalConfig_BotScore = -200;
97 int Configuration::LocalConfig_WarningScore = 2000;
98 int Configuration::LocalConfig_TalkPageWarningScore = -800;
99 QList<ScoreWord> Configuration::LocalConfig_ScoreParts;
100 QList<ScoreWord> Configuration::LocalConfig_ScoreWords;
101 int Configuration::LocalConfig_ScoreFlag = -20000;
102 QStringList Configuration::LocalConfig_WelcomeTypes;
104 bool Configuration::NextOnRv = true;
105 bool Configuration::LocalConfig_WelcomeGood = true;
106 QString Configuration::LocalConfig_ClearTalkPageTemp = "{{Huggle/Cleared}}";
107 QString Configuration::LocalConfig_WelcomeAnon = "{{subst:Welcome-anon}} ~~~~";
108 bool Configuration::GlobalConfigWasLoaded = false;
109 bool Configuration::LocalConfig_GlobalRequired = true;
110 bool Configuration::LocalConfig_AIV = false;
111 bool Configuration::LocalConfig_AIVExtend = true;
112 QString Configuration::LocalConfig_ReportPath = "";
116 QString Configuration::Language = "en";
117 int Configuration::LocalConfig_WhitelistScore = -800;
118 double Configuration::RvCounter = 0;
120 double Configuration::EditCounter = 0;
122 bool Configuration::QueueNewEditsUp = false;
123 QString Configuration::LocalConfig_WelcomeSummary = "Welcoming user";
124 QString Configuration::LocalConfig_WelcomeTitle = "Welcome";
125 bool Configuration::WelcomeEmpty = true;
126 QString Configuration::LocalConfig_ReportSummary = "Reporting user";
127 bool Configuration::_SafeMode = false;
128 
129 QString Configuration::LocalConfig_NSProject = MEDIAWIKI_DEFAULT_NS_PROJECT;
130 QString Configuration::LocalConfig_NSProjectTalk = MEDIAWIKI_DEFAULT_NS_PROJECTTALK;
131 QString Configuration::LocalConfig_NSTalk = MEDIAWIKI_DEFAULT_NS_TALK;
132 QString Configuration::LocalConfig_NSUser = MEDIAWIKI_DEFAULT_NS_USER;
133 QString Configuration::LocalConfig_NSUserTalk = MEDIAWIKI_DEFAULT_NS_USERTALK;
134 QString Configuration::LocalConfig_NSFile = MEDIAWIKI_DEFAULT_NS_FILE;
135 QString Configuration::LocalConfig_NSFileTalk = MEDIAWIKI_DEFAULT_NS_FILETALK;
136 QString Configuration::LocalConfig_NSCategory = MEDIAWIKI_DEFAULT_NS_CATEGORY;
137 QString Configuration::LocalConfig_NSCategoryTalk = MEDIAWIKI_DEFAULT_NS_CATEGORYTALK;
138 QString Configuration::LocalConfig_NSMediaWiki = MEDIAWIKI_DEFAULT_NS_MEDIAWIKI;
139 QString Configuration::LocalConfig_NSMediaWikiTalk = MEDIAWIKI_DEFAULT_NS_MEDIAWIKITALK;
140 QString Configuration::LocalConfig_NSHelp = MEDIAWIKI_DEFAULT_NS_HELP;
141 QString Configuration::LocalConfig_NSHelpTalk = MEDIAWIKI_DEFAULT_NS_HELPTALK;
142 QString Configuration::LocalConfig_NSPortal = MEDIAWIKI_DEFAULT_NS_PORTAL;
143 QString Configuration::LocalConfig_NSPortalTalk = MEDIAWIKI_DEFAULT_NS_PORTALTALK;
144 
145 QStringList Configuration::LocalConfig_DeletionTemplates;
146 int Configuration::LocalConfig_TemplateAge = -30;
148 
149 // Blocking users
150 QStringList Configuration::LocalConfig_BlockExpiryOptions;
151 QString Configuration::LocalConfig_BlockTime = "indefinite";
152 QString Configuration::LocalConfig_BlockTimeAnon = "31 hours";
153 QString Configuration::LocalConfig_BlockMessage = "{{subst:huggle/block|1=$1|2=$2}}";
154 QString Configuration::LocalConfig_BlockMessageIndef = "{{subst:huggle/block-indef|1=$1}}";
155 QString Configuration::LocalConfig_BlockReason = "[[WP:VAND|Vandalism]]";
156 QString Configuration::LocalConfig_BlockSummary = "Notification: Blocked";
158 QString Configuration::VandalNw_Server = "hub.tm-irc.org";
159 bool Configuration::VandalNw_Login = true;
160 
161 QString Configuration::LocalConfig_ProtectReason = "Persistent [[WP:VAND|vandalism]]";
162 
163 bool Configuration::LocalConfig_ConfirmMultipleEdits = false;
164 bool Configuration::LocalConfig_ConfirmRange = false;
165 bool Configuration::LocalConfig_ConfirmPage = false;
166 bool Configuration::LocalConfig_ConfirmSame = false;
167 bool Configuration::LocalConfig_ConfirmWarned = false;
168 int Configuration::FontSize = 10;
173 
174 
175 bool Configuration::LocalConfig_UAAavailable = false;
176 QString Configuration::LocalConfig_UAAPath = "Project:Usernames for administrator attention";
177 QString Configuration::LocalConfig_UAATemplate = "* {{user-uaa|1=$1}} $2 ~~~~";
178 
180 {
182  {
183  return "http://";
184  }
185  return "https://";
186 }
187 
189 {
190  QDir conf(Configuration::HomePath + QDir::separator() + "Configuration");
191  if (!conf.exists())
192  {
193  conf.mkdir(Configuration::HomePath + QDir::separator() + "Configuration");
194  }
195  return Configuration::HomePath + QDir::separator() + "Configuration" + QDir::separator();
196 }
197 
199 {
200  QString summary = Configuration::DefaultRevertSummary;
201  summary = summary.replace("$1", source) + " " + Configuration::EditSuffixOfHuggle;
202  return summary;
203 }
204 
206 {
207  if (b)
208  {
209  return "true";
210  }
211  return "false";
212 }
213 
214 void Configuration::NormalizeConf()
215 {
216  if (Configuration::LocalConfig_TemplateAge > -1)
217  {
218  Configuration::LocalConfig_TemplateAge = -30;
219  }
221  {
223  }
225  {
227  }
229 }
230 
231 
232 bool Configuration::SafeBool(QString value, bool defaultvalue)
233 {
234  if (value.toLower() == "true")
235  {
236  return true;
237  }
238  return defaultvalue;
239 }
240 
242 {
243  QString conf = "<nowiki>\n";
244  conf += "enable:true\n";
245  conf += "version:" + Configuration::HuggleVersion + "\n\n";
246  conf += "admin:true\n";
247  conf += "patrol-speedy:true\n";
248  conf += "speedy-message-title:Speedy deleted\n";
249  conf += "report-summary:" + Configuration::LocalConfig_ReportSummary + "\n";
250  conf += "prod-message-summary:Notification: Proposed deletion of [[$1]]\n";
251  conf += "warn-summary-4:" + Configuration::LocalConfig_WarnSummary4 + "\n";
252  conf += "warn-summary-3:" + Configuration::LocalConfig_WarnSummary3 + "\n";
253  conf += "warn-summary-2:" + Configuration::LocalConfig_WarnSummary2 + "\n";
254  conf += "warn-summary:" + Configuration::LocalConfig_WarnSummary + "\n";
255  conf += "auto-advance:false\n";
256  conf += "auto-whitelist:true\n";
257  conf += "confirm-multiple:" + Configuration::Bool2String(Configuration::LocalConfig_ConfirmMultipleEdits) + "\n";
258  conf += "confirm-range:" + Configuration::Bool2String(Configuration::LocalConfig_ConfirmRange) + "\n";
259  conf += "automatically-resolve-conflicts:" + Configuration::Bool2String(Configuration::AutomaticallyResolveConflicts) + "\n";
260  conf += "confirm-page:" + Configuration::Bool2String(Configuration::LocalConfig_ConfirmPage) + "\n";
261  conf += "template-age:" + QString::number(Configuration::LocalConfig_TemplateAge) + "\n";
262  conf += "confirm-same:" + Configuration::Bool2String(Configuration::LocalConfig_ConfirmSame) + "\n";
263  conf += "default-summary:" + Configuration::DefaultRevertSummary + "\n";
264  conf += "software-rollback:" + Configuration::Bool2String(Configuration::EnforceManualSoftwareRollback) + "\n";
265  conf += "diff-font-size:" + QString::number(Configuration::FontSize) + "\n";
266  conf += "</nowiki>";
267  return conf;
268 }
269 
271 {
272  QFile file(Configuration::GetConfigurationPath() + "huggle3.xml");
274  if (!QFile().exists(Configuration::GetConfigurationPath() + "huggle3.xml"))
275  {
276  Core::DebugLog("No config file at " + Configuration::GetConfigurationPath() + "huggle3.xml");
277  return;
278  }
279  if(!file.open(QIODevice::ReadOnly))
280  {
281  Core::DebugLog("Unable to read config file");
282  return;
283  }
284  QDomDocument conf;
285  conf.setContent(file.readAll());
286  QDomNodeList l = conf.elementsByTagName("local");
287  int item = 0;
288  while (item < l.count())
289  {
290  QDomElement option = l.at(item).toElement();
291  QDomNamedNodeMap xx = option.attributes();
292  if (!xx.contains("text") || !xx.contains("key"))
293  {
294  continue;
295  }
296  QString key = option.attribute("key");
297  if (key == "DefaultRevertSummary")
298  {
299  Configuration::DefaultRevertSummary = option.attribute("text");
300  item++;
301  continue;
302  }
303  if (key == "Cache_InfoSize")
304  {
305  Configuration::Cache_InfoSize = option.attribute("text").toInt();
306  item++;
307  continue;
308  }
309  if (key == "GlobalConfigurationWikiAddress")
310  {
311  Configuration::GlobalConfigurationWikiAddress = option.attribute("text");
312  item++;
313  continue;
314  }
315  if (key == "IRCIdent")
316  {
317  Configuration::IRCIdent = option.attribute("text");
318  item++;
319  continue;
320  }
321  if (key == "IRCNick")
322  {
323  Configuration::IRCNick = option.attribute("text");
324  item++;
325  continue;
326  }
327  if (key == "IRCPort")
328  {
329  Configuration::IRCPort = option.attribute("text").toInt();
330  item++;
331  continue;
332  }
333  if (key == "IRCServer")
334  {
335  Configuration::IRCServer = option.attribute("text");
336  item++;
337  continue;
338  }
339  if (key == "Language")
340  {
341  Configuration::Language = option.attribute("text");
342  item++;
343  continue;
344  }
345  if (key == "ProviderCache")
346  {
347  Configuration::ProviderCache = option.attribute("text").toInt();
348  item++;
349  continue;
350  }
351  if (key == "AskUserBeforeReport")
352  {
353  Configuration::AskUserBeforeReport = Configuration::SafeBool(option.attribute("text"));
354  item++;
355  continue;
356  }
357  if (key == "HistorySize")
358  {
359  Configuration::HistorySize = option.attribute("text").toInt();
360  item++;
361  continue;
362  }
363  if (key == "VandalNw_Login")
364  {
365  Configuration::VandalNw_Login = Configuration::SafeBool(option.attribute("text"));
366  item++;
367  continue;
368  }
369  item++;
370  }
371  Core::DebugLog("Finished conf");
372 }
373 
375 {
376  QFile file(Configuration::GetConfigurationPath() + QDir::separator() + "huggle3.xml");
377  if (!file.open(QIODevice::WriteOnly))
378  {
379  Core::Log("Unable to save configuration because the file can't be open");
380  return;
381  }
382  QXmlStreamWriter *x = new QXmlStreamWriter();
383  x->setDevice(&file);
384  x->writeStartDocument();
385  Configuration::InsertConfig("Cache_InfoSize", QString::number(Configuration::Cache_InfoSize), x);
386  Configuration::InsertConfig("DefaultRevertSummary", Configuration::DefaultRevertSummary, x);
390  Configuration::InsertConfig("IRCPort", QString::number(Configuration::IRCPort), x);
393  Configuration::InsertConfig("ProviderCache", QString::number(Configuration::ProviderCache), x);
395  Configuration::InsertConfig("HistorySize", QString::number(Configuration::HistorySize), x);
396  Configuration::InsertConfig("NextOnRv", Configuration::Bool2String(Configuration::NextOnRv), x);
398  Configuration::InsertConfig("RingLogMaxSize", QString::number(Configuration::RingLogMaxSize), x);
402  /////////////////////////////
403  // Vandal network
404  /////////////////////////////
405  Configuration::InsertConfig("VandalNw_Login", Configuration::Bool2String(Configuration::VandalNw_Login), x);
406  x->writeEndDocument();
407  delete x;
408 }
409 
410 QStringList Configuration::ConfigurationParse_QL(QString key, QString content, bool CS)
411 {
412  QStringList list;
413  if (content.startsWith(key + ":"))
414  {
415  QString value = content.mid(key.length() + 1);
416  QStringList lines = value.split("\n");
417  int curr = 1;
418  while (curr < lines.count())
419  {
420  QString _line = Core::Trim(lines.at(curr));
421  if (_line.endsWith(","))
422  {
423  list.append(_line);
424  } else
425  {
426  if (_line != "")
427  {
428  list.append(_line);
429  break;
430  }
431  }
432  curr++;
433  }
434  if (CS)
435  {
436  // now we need to split values by comma as well
437  QStringList f;
438  int c = 0;
439  while (c<list.count())
440  {
441  QStringList xx = list.at(c).split(",");
442  int i2 = 0;
443  while (i2<xx.count())
444  {
445  if (Core::Trim(xx.at(i2)) != "")
446  {
447  f.append(Core::Trim(xx.at(i2)));
448  }
449  i2++;
450  }
451  c++;
452  }
453  list = f;
454  }
455  return list;
456  } else if (content.contains("\n" + key + ":"))
457  {
458  QString value = content.mid(content.indexOf("\n" + key + ":") + key.length() + 2);
459  QStringList lines = value.split("\n");
460  int curr = 1;
461  while (curr < lines.count())
462  {
463  QString _line = Core::Trim(lines.at(curr));
464  if (_line.endsWith(","))
465  {
466  list.append(_line);
467  } else
468  {
469  if (_line != "")
470  {
471  list.append(_line);
472  break;
473  }
474  }
475  curr++;
476  }
477  if (CS)
478  {
479  // now we need to split values by comma as well
480  QStringList f;
481  int c = 0;
482  while (c<list.count())
483  {
484  QStringList xx = list.at(c).split(",");
485  int i2 = 0;
486  while (i2<xx.count())
487  {
488  if (Core::Trim(xx.at(i2)) != "")
489  {
490  f.append(Core::Trim(xx.at(i2)));
491  }
492  i2++;
493  }
494  c++;
495  }
496  list = f;
497  }
498  return list;
499  }
500  return list;
501 }
502 
503 QStringList Configuration::ConfigurationParse_QL(QString key, QString content, QStringList list, bool CS)
504 {
505  QStringList result = Configuration::ConfigurationParse_QL(key, content, CS);
506  if (result.count() == 0)
507  {
508  return list;
509  }
510  return result;
511 }
512 
514 {
515  Configuration::GlobalConfig_EnableAll = Configuration::SafeBool(Configuration::ConfigurationParse("enable-all", config));
516  QString temp = Configuration::ConfigurationParse("documentation", config);
517  if (temp != "")
518  {
519  Configuration::GlobalConfig_DocumentationPath = temp;
520  }
521  temp = Configuration::ConfigurationParse("feedback", config);
522  if (temp != "")
523  {
524  Configuration::GlobalConfig_FeedbackPath = temp;
525  }
526  Configuration::GlobalConfigWasLoaded = true;
527  return true;
528 }
529 
531 {
532  //AIV
533  Configuration::LocalConfig_AIV = Configuration::SafeBool(Configuration::ConfigurationParse("aiv-reports", config));
534  Configuration::LocalConfig_AIVExtend = Configuration::SafeBool(Configuration::ConfigurationParse("aiv-extend", config));
535  // Restrictions
536  Configuration::LocalConfig_EnableAll = Configuration::SafeBool(Configuration::ConfigurationParse("enable-all", config));
537  Configuration::LocalConfig_RequireAdmin = Configuration::SafeBool(Configuration::ConfigurationParse("require-admin", config));
538  Configuration::LocalConfig_RequireRollback = Configuration::SafeBool(Configuration::ConfigurationParse("require-rollback", config));
539  Configuration::LocalConfig_RequireEdits = Configuration::ConfigurationParse("require-edits", config, "0").toInt();
540  Configuration::LocalConfig_UseIrc = Configuration::SafeBool(Configuration::ConfigurationParse("irc", config));
541  Configuration::LocalConfig_Ignores = Configuration::ConfigurationParse_QL("ignore", config, true);
542  Configuration::LocalConfig_IPScore = Configuration::ConfigurationParse("score-ip", config, "800").toInt();
543  Configuration::LocalConfig_ScoreFlag = Configuration::ConfigurationParse("score-flag", config).toInt();
544  Configuration::LocalConfig_WarnSummary = Configuration::ConfigurationParse("warn-summary", config);
545  Configuration::LocalConfig_WarnSummary2 = Configuration::ConfigurationParse("warn-summary-2", config);
546  Configuration::LocalConfig_WarnSummary3 = Configuration::ConfigurationParse("warn-summary-3", config);
547  Configuration::LocalConfig_WarnSummary4 = Configuration::ConfigurationParse("warn-summary-4", config);
548  Configuration::LocalConfig_RevertSummaries = Configuration::ConfigurationParse_QL("template-summ", config);
549  Configuration::LocalConfig_WarningTypes = Configuration::ConfigurationParse_QL("warning-types", config);
550  Configuration::LocalConfig_WarningDefs = Configuration::ConfigurationParse_QL("warning-template-tags", config);
551  Configuration::LocalConfig_BotScore = Configuration::ConfigurationParse("score-bot", config, "-200000").toInt();
552  Configuration::LocalConfig_ReportPath = Configuration::ConfigurationParse("aiv", config);
556  Configuration::AutomaticallyResolveConflicts = Configuration::SafeBool(Configuration::ConfigurationParse("automatically-resolve-conflicts", config), false);
557  Configuration::LocalConfig_WelcomeTypes = Configuration::ConfigurationParse_QL("welcome-messages", config);
558  Configuration::LocalConfig_ReportSummary = Configuration::ConfigurationParse("report-summary", config);
559  Configuration::LocalConfig_DeletionTemplates = Configuration::ConfigurationParse_QL("speedy-options", config);
560  Configuration::LocalConfig_TemplateAge = Configuration::ConfigurationParse("template-age", config, QString::number(Configuration::LocalConfig_TemplateAge)).toInt();
561  Configuration::LocalConfig_WelcomeGood = Configuration::SafeBool(Configuration::ConfigurationParse("welcome-on-good-edit", config, "true"));
562  Configuration::LocalConfig_UAAPath = Configuration::ConfigurationParse("uaa", config);
563  Configuration::LocalConfig_ConfirmMultipleEdits = Configuration::SafeBool(Configuration::ConfigurationParse("confirm-multiple", config));
564  Configuration::LocalConfig_ConfirmRange = Configuration::SafeBool(Configuration::ConfigurationParse("confirm-range", config));
565  Configuration::LocalConfig_ConfirmSame = Configuration::SafeBool(Configuration::ConfigurationParse("confirm-same", config));
566  Configuration::LocalConfig_ConfirmWarned = Configuration::SafeBool(Configuration::ConfigurationParse("confirm-warned", config));
567  Configuration::LocalConfig_DefaultSummary = Configuration::ConfigurationParse("default-summary", config,
568  "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]]) to last revision by $2");
569  Configuration::LocalConfig_AgfRevert = Configuration::ConfigurationParse("agf", config,
570  "Reverted good faith edits by [[Special:Contributions/$2|$2]] [[User talk:$2|talk]]");
571  Configuration::LocalConfig_BlockMessage = Configuration::ConfigurationParse("block-message", config);
572  Configuration::LocalConfig_BlockReason = Configuration::ConfigurationParse("block-reason", config);
573  Configuration::LocalConfig_BlockSummary = Configuration::ConfigurationParse("block-summary", config, "Notification: Blocked");
574  Configuration::LocalConfig_BlockTime = Configuration::ConfigurationParse("blocktime", config, "indef");
575  Configuration::LocalConfig_ClearTalkPageTemp = Configuration::ConfigurationParse("template-clear-talk-page", config, "{{Huggle/Cleared}}");
576  Configuration::LocalConfig_IgnorePatterns = Configuration::ConfigurationParse_QL("ignore-patterns", config);
577  Configuration::LocalConfig_SoftwareRevertDefaultSummary = Configuration::ConfigurationParse("manual-revert-summary", config,
578  "Reverted edits by [[Special:Contributions/$1|$1]] to last revision by $2");
579  Configuration::LocalConfig_MultipleRevertSummary = Configuration::ConfigurationParse("multiple-revert-summary-parts", config,
580  "Reverted,edit by,edits by,and,other users,to last revision by,to an older version by");
581  Configuration::LocalConfig_ProtectReason = Configuration::ConfigurationParse("protection-reason", config, "Excessive [[Wikipedia:Vandalism|vandalism]]");
582  Configuration::LocalConfig_RevertPatterns = Configuration::ConfigurationParse_QL("revert-patterns", config);
583  Configuration::LocalConfig_RollbackSummary = Configuration::ConfigurationParse("rollback-summary", config,
584  "Reverted edits by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]]) to last revision by $2");
585  Configuration::LocalConfig_SingleRevert = Configuration::ConfigurationParse("single-revert-summary", config,
586  "Undid edit by [[Special:Contributions/$1|$1]] ([[User talk:$1|talk]])");
587  Configuration::LocalConfig_UndoSummary = Configuration::ConfigurationParse("undo-summary", config);
588 
589  if (Core::AIVP != NULL)
590  {
591  delete Core::AIVP;
592  }
593 
594  Core::AIVP = new WikiPage(Configuration::LocalConfig_ReportPath);
595  Core::ParsePats(config);
596  Core::ParseWords(config);
597  QStringList namespaces = Configuration::ConfigurationParse_QL("namespace-names", config, true);
598  int NS=0;
599  while (namespaces.count() > NS)
600  {
601  QString line = namespaces.at(NS);
602  NS++;
603 
604  if (!line.contains(",") || !line.contains(";"))
605  {
606  continue;
607  }
608 
609  int ns = line.mid(0, line.indexOf(";")).toInt();
610  QString name = line.mid(line.indexOf(";"));
611 
612  if (!name.contains(","))
613  {
614  continue;
615  }
616 
617  name = name.mid(0, name.indexOf(","));
618  QString talk = line.mid(line.indexOf(",") + 1);
619 
620  if (talk.endsWith(","))
621  {
622  talk = talk.mid(0, talk.length() - 1);
623  }
624 
625  if (talk.contains(";"))
626  {
627  talk = talk.mid(talk.indexOf(";") + 1);
628  }
629 
630  switch (ns)
631  {
632  /// \todo Some NS are missing here
633  case MEDIAWIKI_NSID_MAIN:
634  Configuration::LocalConfig_NSTalk = talk;
635  break;
636  case MEDIAWIKI_NSID_CATEGORY:
637  Configuration::LocalConfig_NSCategory = name;
638  Configuration::LocalConfig_NSCategoryTalk = talk;
639  break;
640  case MEDIAWIKI_NSID_FILE:
641  Configuration::LocalConfig_NSFile = name;
642  Configuration::LocalConfig_NSFileTalk = talk;
643  break;
644  case MEDIAWIKI_NSID_HELP:
645  Configuration::LocalConfig_NSHelp = name;
646  Configuration::LocalConfig_NSHelpTalk = talk;
647  break;
648  case MEDIAWIKI_NSID_MEDIAWIKI:
649  Configuration::LocalConfig_NSMediaWiki = name;
650  Configuration::LocalConfig_NSMediaWikiTalk = talk;
651  break;
652  }
653  }
654 
655  Core::UAAP = new WikiPage(Configuration::LocalConfig_UAAPath);
656 
657  // templates
658  int CurrentTemplate=0;
659  while (CurrentTemplate<Configuration::LocalConfig_WarningTypes.count())
660  {
661  QString type = Core::GetKeyFromValue(Configuration::LocalConfig_WarningTypes.at(CurrentTemplate));
662  int CurrentWarning = 1;
663  while (CurrentWarning <= 4)
664  {
665  QString xx = Configuration::ConfigurationParse(type + QString::number(CurrentWarning), config);
666  if (xx != "")
667  {
668  Configuration::LocalConfig_WarningTemplates.append(type + QString::number(CurrentWarning) + ";" + xx);
669  }
670  CurrentWarning++;
671  }
672  CurrentTemplate++;
673  }
674  // sanitize
675  if (Configuration::LocalConfig_ReportPath == "")
676  {
677  Configuration::LocalConfig_AIV = false;
678  }
679  // Do the same for UAA as well
680  if (Configuration::LocalConfig_UAAPath == "")
681  {
682  Configuration::LocalConfig_UAAavailable = false;
683  }
684  return true;
685 }
686 
687 bool Configuration::ParseUserConfig(QString config)
688 {
689  Configuration::LocalConfig_EnableAll = Configuration::SafeBool(Configuration::ConfigurationParse("enable", config));
690  Configuration::LocalConfig_Ignores = Configuration::ConfigurationParse_QL("ignore", config, Configuration::LocalConfig_Ignores);
691  Configuration::LocalConfig_IPScore = Configuration::ConfigurationParse("score-ip", config, QString::number(Configuration::LocalConfig_IPScore)).toInt();
692  Configuration::LocalConfig_ScoreFlag = Configuration::ConfigurationParse("score-flag", config, QString::number(Configuration::LocalConfig_ScoreFlag)).toInt();
693  Configuration::LocalConfig_WarnSummary = Configuration::ConfigurationParse("warn-summary", config, Configuration::LocalConfig_WarnSummary);
694  Configuration::EnforceManualSoftwareRollback = Configuration::SafeBool(Configuration::ConfigurationParse("software-rollback", config));
695  Configuration::LocalConfig_WarnSummary2 = Configuration::ConfigurationParse("warn-summary-2", config, Configuration::LocalConfig_WarnSummary2);
696  Configuration::LocalConfig_WarnSummary3 = Configuration::ConfigurationParse("warn-summary-3", config, Configuration::LocalConfig_WarnSummary3);
697  Configuration::LocalConfig_WarnSummary4 = Configuration::ConfigurationParse("warn-summary-4", config, Configuration::LocalConfig_WarnSummary4);
698  Configuration::AutomaticallyResolveConflicts = Configuration::SafeBool(Configuration::ConfigurationParse("automatically-resolve-conflicts", config), false);
699  Configuration::LocalConfig_TemplateAge = Configuration::ConfigurationParse("template-age", config, QString::number(Configuration::LocalConfig_TemplateAge)).toInt();
700  Configuration::LocalConfig_RevertSummaries = Configuration::ConfigurationParse_QL("template-summ", config, Configuration::LocalConfig_RevertSummaries);
701  Configuration::LocalConfig_WarningTypes = Configuration::ConfigurationParse_QL("warning-types", config, Configuration::LocalConfig_WarningTypes);
702  Configuration::LocalConfig_WarningDefs = Configuration::ConfigurationParse_QL("warning-template-tags", config, Configuration::LocalConfig_WarningDefs);
703  Configuration::LocalConfig_BotScore = Configuration::ConfigurationParse("score-bot", config, QString(Configuration::LocalConfig_BotScore)).toInt();
704  Configuration::NormalizeConf();
705  /// \todo Lot of configuration options are missing
706  return true;
707 }
708 
709 QString Configuration::ConfigurationParse(QString key, QString content, QString missing)
710 {
711  if (content.startsWith(key + ":"))
712  {
713  QString value = content.mid(key.length() + 1);
714  if (value.contains("\n"))
715  {
716  value = value.mid(0, value.indexOf("\n"));
717  }
718  return value;
719  }
720 
721  // make sure it's not inside of some string
722  if (content.contains("\n" + key + ":"))
723  {
724  QString value = content.mid(content.indexOf("\n" + key + ":") + key.length() + 2);
725  if (value.contains("\n"))
726  {
727  value = value.mid(0, value.indexOf("\n"));
728  }
729  return value;
730  }
731  return missing;
732 }
733 
734 void Configuration::InsertConfig(QString key, QString value, QXmlStreamWriter *s)
735 {
736  s->writeStartElement("local");
737  s->writeAttribute("key", key);
738  s->writeAttribute("text", value);
739  s->writeEndElement();
740 }
741 
742 ScoreWord::ScoreWord(QString Word, int Score)
743 {
744  this->score = Score;
745  this->word = Word;
746 }
747 
748 ScoreWord::ScoreWord(ScoreWord *word)
749 {
750  this->score = word->score;
751  this->word = word->word;
752 }
753 
754 ScoreWord::ScoreWord(const ScoreWord &word)
755 {
756  this->score = word.score;
757  this->word = word.word;
758 }
static QString HuggleVersion
Version.
static QStringList ConfigurationParse_QL(QString key, QString content, bool CS=false)
ConfigurationParse_QL Parses a QStringList of values for a given key.
static QString WikiDB
Path to a file where information about wikis are stored.
static WikiPage * AIVP
Pointer to AIV page.
Definition: core.hpp:133
The ScoreWord class.
static void Log(QString Message)
Write text to terminal as well as ring log.
Definition: core.cpp:563
static bool QueueNewEditsUp
Whether new edits go to top or bottom.
static double RvCounter
Number of reverts made since you logged in.
static QString HomePath
Path where huggle contains its data.
static QString UserName
User name.
static int QueryListTimeLimit
Number of seconds for which the processed queries remain in list of processes.
static WikiPage * UAAP
Pointer to UAA page.
Definition: core.hpp:135
static QString GetConfigurationPath()
Return a configuration path.
static bool Restricted
When this is true most of functions will not work.
static bool WelcomeEmpty
Send a message to user on good edit.
static int ReadTimeout
Timeout for queries.
static QString Bool2String(bool b)
Bool2String Convert a bool to string.
static QString GetURLProtocolPrefix()
Return a prefix for url.
static double EditCounter
Number of edits made since you logged in.
static bool TrimOldWarnings
This is experimental feature that removes the old templates from talk pages when they are being read...
static QString LocalConfig_RUTemplateReport
Regular users.
static QString WmfOAuthConsumerKey
Consumer key.
static void LoadConfig()
Load the local configuration from disk.
static bool WarnUserSpaceRoll
Warn you in case you want to revert a user page.
static QString IRCIdent
Ident.
Mediawiki page.
Definition: wikipage.hpp:43
static QString IRCServer
Server.
static bool UsingIRC
Whether IRC is being used.
static void InsertConfig(QString key, QString value, QXmlStreamWriter *s)
InsertConfig.
static QString Language
Language selected by user this is only a language of interface.
static int ProviderCache
Size of feed.
static QStringList EditRegexOfTools
Regexes that other tools can be identified with.
static QString Password
Password.
static QStringList WhiteList
Data of wl.
static int LocalConfig_ReportSt
Section of report page to append template to.
static int Cache_InfoSize
Size of info cache.
static QString IRCNick
Nick.
static int HistorySize
Number of edits to keep in history stack.
static QString MakeLocalUserConfig()
This function creates a user configuration that is stored on wiki.
static bool ParseUserConfig(QString config)
static quint16 IRCPort
Port.
static unsigned int Verbosity
Verbosity for debugging to terminal etc, can be switched with parameter –verbosity.
static int WriteTimeout
Timeout for write / update queries.
static QString LocalConfig_MinimalVersion
Minimal version of huggle required to use it.
static WikiSite Project
currently selected project
static int LocalConfig_ScoreChange
Score that is added for every edit that has really big size.
static QString EditSuffixOfHuggle
Suffix used by huggle.
static int RingLogMaxSize
Maximum size of ringlog.
static void DebugLog(QString Message, unsigned int Verbosity=1)
This log is only shown if verbosity is same or larger than requested verbosity.
Definition: core.cpp:641
static void ParsePats(QString text)
Parse a part patterns for score words.
Definition: core.cpp:251
static int FontSize
Size of fonts in diff.
static bool AutomaticallyResolveConflicts
Resolve edit conflict without asking user.
static bool ParseGlobalConfig(QString config)
Parse all information from global config on meta.
static bool PythonEngine
Whether python is available.
static QString ConfigurationParse(QString key, QString content, QString missing="")
Parse a string from configuration which has format used by huggle 2x.
static bool WhitelistDisabled
Whitelist is not useable.
static QString LocalConfig_IPVTemplateReport
IP vandals.
static bool UsingSSL
If SSL is being used.
static bool ParseLocalConfig(QString config)
Parse all information from local config, this function is used in login.
static QList< WikiSite * > ProjectList
List of projects.
static QString GlobalConfigurationWikiAddress
URL of wiki that contains a global config.
static bool _SafeMode
If this is true some functionalities will be disabled.
static QString WelcomeMP
Where the welcome message is stored.
static QString Trim(QString text)
Remove leading and finishing space of string.
Definition: core.cpp:164
static void SaveConfig()
Save the local configuration to file.
static QString GetDefaultRevertSummary(QString source)
GetDefaultRevertSummary Retrieve default summary.
static bool AskUserBeforeReport
Ask user if they really want to report someone.
static bool EnforceManualSoftwareRollback
If this is true huggle will always use software rollback even if user has the rollback privileges...