void Plugin::hookMessageWillCreated (LeechCraft::IHookProxy_ptr proxy, QObject*, QObject *entry, int, QString) { ICLEntry *other = qobject_cast<ICLEntry*> (entry); if (!other) { qWarning () << Q_FUNC_INFO << "unable to cast" << entry << "to ICLEntry"; return; } QString text = proxy->GetValue ("text").toString (); const int maxLines = XmlSettingsManager::Instance () .property ("LineCount").toInt (); if (text.split ('\n').size () < maxLines) return; QByteArray propName; switch (other->GetEntryType ()) { case ICLEntry::ETChat: propName = "EnableForNormalChats"; break; case ICLEntry::ETMUC: propName = "EnableForMUCChats"; break; case ICLEntry::ETPrivateChat: propName = "EnableForPrivateChats"; break; default: return; } if (!XmlSettingsManager::Instance ().property (propName).toBool ()) return; PasteDialog dia; dia.exec (); auto choice = dia.GetChoice (); switch (choice) { case PasteDialog::Cancel: proxy->CancelDefault (); case PasteDialog::No: return; case PasteDialog::Yes: { auto service = dia.GetCreator () (entry); service->Paste ({ Proxy_->GetNetworkAccessManager (), text, dia.GetHighlight () }); proxy->CancelDefault (); } } }
void Plugin::hookMessageWillCreated (LeechCraft::IHookProxy_ptr proxy, QObject *chatTab, QObject *entry, int, QString) { ICLEntry *other = qobject_cast<ICLEntry*> (entry); if (!other) { qWarning () << Q_FUNC_INFO << "unable to cast" << entry << "to ICLEntry"; return; } QString text = proxy->GetValue ("text").toString (); const int maxLines = XmlSettingsManager::Instance () .property ("LineCount").toInt (); if (text.split ('\n').size () < maxLines) return; QByteArray propName; switch (other->GetEntryType ()) { case ICLEntry::ETChat: propName = "EnableForNormalChats"; break; case ICLEntry::ETMUC: propName = "EnableForMUCChats"; break; case ICLEntry::ETPrivateChat: propName = "EnableForPrivateChats"; break; default: return; } if (!XmlSettingsManager::Instance () .property (propName).toBool ()) return; const bool shouldConfirm = XmlSettingsManager::Instance () .property ("ConfirmPasting").toBool (); if (shouldConfirm && QMessageBox::question (qobject_cast<QWidget*> (chatTab), tr ("Confirm pasting"), tr ("This message is too long according to current " "settings. Would you like to paste it on a " "pastebin?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) return; Paste (text, entry); proxy->CancelDefault (); }
void Plugin::hookURLEditReturnPressed (LeechCraft::IHookProxy_ptr proxy, QObject*) { const auto& text = proxy->GetValue ("Text").toString (); if (text.isEmpty () || !text.contains (' ')) return; const auto& redirect = Keywords2Urls_.value (text.section (' ', 0, 0)); if (redirect.isEmpty ()) return; const auto& query = text.section (' ', 1).toUtf8 (); const auto& encoded = query.toPercentEncoding (); proxy->SetValue ("Text", redirect.arg (QString::fromUtf8 (encoded))); }
void FUA::hookUserAgentForUrlRequested (LeechCraft::IHookProxy_ptr proxy, const QUrl& url, const QWebPage*) { QString host = url.host (); for (int i = 0; i < Model_->rowCount (); ++i) { QStandardItem *item = Model_->item (i); QRegExp re (item->text (), Qt::CaseSensitive, QRegExp::Wildcard); if (re.exactMatch (host)) { proxy->CancelDefault (); proxy->SetReturnValue (Model_->item (i, 2)->text ()); return; } } }
void Plugin::hookAcceptNavigationRequest (LeechCraft::IHookProxy_ptr proxy, QWebPage*, QWebFrame*, QNetworkRequest request, QWebPage::NavigationType) { if (!request.url ().path ().endsWith ("user.js", Qt::CaseInsensitive) || request.url ().scheme () == "file") return; UserScriptInstallerDialog installer (this, CoreProxy_->GetNetworkAccessManager (), request.url ()); switch (installer.exec ()) { case UserScriptInstallerDialog::Install: UserScripts_.append (UserScript (installer.TempScriptPath ())); UserScripts_.last ().Install (CoreProxy_->GetNetworkAccessManager ()); AddScriptToManager (UserScripts_.last ()); break; case UserScriptInstallerDialog::ShowSource: Proxy_->OpenInNewTab (QUrl::fromLocalFile (installer.TempScriptPath ())); break; case UserScriptInstallerDialog::Cancel: QFile::remove (installer.TempScriptPath ()); break; default: break; } proxy->CancelDefault (); }
void Plugin::hookEntryActionsRequested (LeechCraft::IHookProxy_ptr proxy, QObject *entry) { if (!qobject_cast<MRIMBuddy*> (entry)) return; if (!EntryServices_.contains (entry)) { auto list = VaderUtil::GetBuddyServices (this, SLOT (entryServiceRequested ())); Q_FOREACH (QAction *act, list) act->setProperty ("Azoth/Vader/Entry", QVariant::fromValue<QObject*> (entry)); EntryServices_ [entry] = list; } QList<QVariant> list = proxy->GetReturnValue ().toList (); Q_FOREACH (QAction *act, EntryServices_ [entry]) list += QVariant::fromValue<QObject*> (act); proxy->SetReturnValue (list); }
void Plugin::hookMessageWillCreated (LeechCraft::IHookProxy_ptr proxy, QObject *chatTab, QObject *entry, int, QString) { ICLEntry *other = qobject_cast<ICLEntry*> (entry); if (!other) { qWarning () << Q_FUNC_INFO << "unable to cast" << entry << "to ICLEntry"; return; } if (!other->GetEntryID ().contains ("*****@*****.**")) return; QString text = proxy->GetValue ("text").toString (); Typo typos[] = { Typo (text, QString::fromUtf8 ("^!\\s+[#№]{2,}(\\d+)"), QString ("! #\\1")), Typo (text, "^!\\s+(\\d+)", QString ("! #\\1")), Typo (text, QString::fromUtf8 ("^![#№](\\d+)"), QString ("! #\\1")), Typo (text, "^!(\\d+)", QString ("! #\\1")), Typo (text, QString::fromUtf8 ("^[SЫ]\\s+[#№]{2,}(\\d+)"), QString ("S #\\1")), Typo (text, QString::fromUtf8 ("^[SЫ]\\s+(\\d+)"), QString ("S #\\1")), Typo (text, QString::fromUtf8 ("^[SЫ][#№](\\d+)"), QString ("S #\\1")), Typo (text, QString::fromUtf8 ("^[SЫ](\\d+)"), QString ("S #\\1")), Typo (text, QString::fromUtf8 ("^Ы [#№](\\d+)"), QString ("S #\\1")), Typo (text, QString::fromUtf8 ("^ЗЬ\\s+@(.*)"), QString ("PM @\\1")), Typo (text, "^(\\d+)\\s+(.*)", QString ("#\\1 \\2")), Typo (text, "^(\\d+/\\d+)\\s+(.*)", QString ("#\\1 \\2")), Typo (text, QString::fromUtf8 ("^№\\+$"), QString ("#+")), Typo (text, QString::fromUtf8 ("^\"$"), QString ("@")), Typo (text, QString::fromUtf8 ("^В\\s?Д$"), QString ("D L")), Typo (text, QString::fromUtf8 ("$Ы^"), QString ("S")), Typo (text, QString::fromUtf8 ("^[UГ]\\s+[#№]{2,}(\\d+)"), QString ("U #\\1")), Typo (text, QString::fromUtf8 ("^[UГ]\\s+(\\d+)"), QString ("U #\\1")), Typo (text, QString::fromUtf8 ("^[UГ][#№](\\d+)"), QString ("U #\\1")), Typo (text, QString::fromUtf8 ("^[UГ](\\d+)"), QString ("U #\\1")), Typo (text, QString::fromUtf8 ("^Г [#№](\\d+)"), QString ("U #\\1")), Typo (text, QString::fromUtf8 ("^В [#№](\\d+)"), QString ("D #\\1")), Typo (text, QString::fromUtf8 ("^[DВ][#№](\\d+)"), QString ("D #\\1")), Typo (text, QString::fromUtf8 ("^[DВ](\\d+)"), QString ("D #\\1")), Typo (text, QString::fromUtf8 ("^РУДЗ$"), QString ("HELP")), Typo (text, QString::fromUtf8 ("^ДЩПШТ$"), QString ("LOGIN")), Typo (text, QString::fromUtf8 ("^ЩТ(\\+?)$"), QString ("ON\\1")), Typo (text, QString::fromUtf8 ("^ЩАА$"), QString ("OFF")), Typo (text, QString::fromUtf8 ("^ИД(\\s?)"), QString ("BL\\1")), Typo (text, QString::fromUtf8 ("^ЦД(\\s?)"), QString ("WL\\1")), Typo (text, QString::fromUtf8 ("^ШТМШЕУ "), QString ("INVITE ")), Typo (text, QString::fromUtf8 ("^МСФКВ$"), QString ("VCARD")), Typo (text, QString::fromUtf8 ("^ЗШТП$"), QString ("PING")), Typo (text, QString::fromUtf8 ("^№+$"), [] (QString str) { return str.replace ("№", "#"); }) }; for (int i = 0; i < static_cast<int> (sizeof (typos) / sizeof (Typo)); ++i) { Typo typo = typos [i]; if (!typo.Done ()) continue; QSettings settings (QCoreApplication::organizationName (), QCoreApplication::applicationName () + "_AzothJuick"); QWidget* parent = qobject_cast<QWidget*> (chatTab); QString correction = typo.Correction (); bool askForCorrection = settings.value ("AskForCorrection", true).toBool (); if (!parent) { qWarning () << Q_FUNC_INFO << "unable to cast" << chatTab << "to QWidget"; return; } QMessageBox msgbox (QMessageBox::Question, tr ("Fix typo?"), tr ("Did you mean <em>%1</em> instead of <em>%2</em>?") .arg (correction) .arg (text), QMessageBox::NoButton, parent); msgbox.addButton (QMessageBox::Yes); QPushButton *always = msgbox.addButton (tr ("Always"), QMessageBox::YesRole); msgbox.addButton (QMessageBox::No); if (!askForCorrection || msgbox.exec () != QMessageBox::No) { proxy->SetValue ("text", correction); if (msgbox.clickedButton () == always) settings.setValue ("AskForCorrection", false); } break; } }
void Plugin::hookGotMessage (LeechCraft::IHookProxy_ptr proxy, QObject *message) { if (!IsConfValid ()) return; if (OurMessages_.contains (message)) { OurMessages_.remove (message); proxy->CancelDefault (); return; } IMessage *msg = qobject_cast<IMessage*> (message); if (!msg) { qWarning () << Q_FUNC_INFO << message << "doesn't implement IMessage"; return; } if (msg->GetMessageType () != IMessage::MTChatMessage) return; QObject *entryObj = msg->OtherPart (); ICLEntry *entry = qobject_cast<ICLEntry*> (entryObj); if (IsEntryAllowed (entryObj)) return; if (!AskedEntries_.contains (entryObj)) { AskedEntries_ << entryObj; const QString& text = tr ("Please answer to the following " "question to verify you are not a bot and is welcome " "to communicate with me:\n%1") .arg (ConfWidget_->GetQuestion ()); QObject *msgObj = entry->CreateMessage (IMessage::MTChatMessage, QString (), text); OurMessages_ << msgObj; qobject_cast<IMessage*> (msgObj)->Send (); proxy->CancelDefault (); } else if (ConfWidget_->GetAnswers ().contains (msg->GetBody ().toLower ())) { AllowedEntries_ << entryObj; AskedEntries_.remove (entryObj); const QString& text = tr ("Nice, seems like you've answered " "correctly. Please write again now what you wanted " "to write."); QObject *msgObj = entry->CreateMessage (IMessage::MTChatMessage, QString (), text); OurMessages_ << msgObj; qobject_cast<IMessage*> (msgObj)->Send (); } else { const QString& text = tr ("Sorry, you are wrong. Try again."); QObject *msgObj = entry->CreateMessage (IMessage::MTChatMessage, QString (), text); OurMessages_ << msgObj; qobject_cast<IMessage*> (msgObj)->Send (); proxy->CancelDefault (); } }
void Plugin::hookMessageWillCreated (LeechCraft::IHookProxy_ptr proxy, QObject*, QObject *entry, int, QString) { ICLEntry *other = qobject_cast<ICLEntry*> (entry); if (!other) { qWarning () << Q_FUNC_INFO << "unable to cast" << entry << "to ICLEntry"; return; } QString text = proxy->GetValue ("text").toString (); const int maxLines = XmlSettingsManager::Instance () .property ("LineCount").toInt (); const int maxSymbols = XmlSettingsManager::Instance () .property ("SymbolCount").toInt (); if (text.size () < maxSymbols && text.count ('\n') + 1 < maxLines) return; QByteArray propName; switch (other->GetEntryType ()) { case ICLEntry::ETChat: propName = "EnableForNormalChats"; break; case ICLEntry::ETMUC: propName = "EnableForMUCChats"; break; case ICLEntry::ETPrivateChat: propName = "EnableForPrivateChats"; break; default: return; } if (!XmlSettingsManager::Instance ().property (propName).toBool ()) return; QSettings settings (QCoreApplication::organizationName (), QCoreApplication::applicationName () + "_Azoth_Autopaste"); settings.beginGroup ("SavedChoices"); settings.beginGroup (other->GetEntryID ()); auto guard = std::shared_ptr<void> (nullptr, [&settings] (void*) -> void { settings.endGroup (); settings.endGroup (); }); PasteDialog dia; dia.SetCreatorName (settings.value ("Service").toString ()); dia.SetHighlight (static_cast<Highlight> (settings.value ("Highlight").toInt ())); dia.exec (); switch (dia.GetChoice ()) { case PasteDialog::Cancel: proxy->CancelDefault (); case PasteDialog::No: return; case PasteDialog::Yes: { auto service = dia.GetCreator () (entry); service->Paste ({ Proxy_->GetNetworkAccessManager (), text, dia.GetHighlight () }); proxy->CancelDefault (); settings.setValue ("Service", dia.GetCreatorName ()); settings.setValue ("Highlight", static_cast<int> (dia.GetHighlight ())); } } }