Initial commit
This commit is contained in:
commit
02f6b25688
114
init.php
Normal file
114
init.php
Normal file
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
class Discord_Webhook extends Plugin {
|
||||
private $host;
|
||||
private $discord_api_url = "https://discordapp.com/api/webhooks/";
|
||||
|
||||
function about() {
|
||||
return array(1.0,
|
||||
"Filter action to send articles to Discord",
|
||||
"Roliga");
|
||||
}
|
||||
|
||||
function init($host) {
|
||||
$this->host = $host;
|
||||
|
||||
$this->pdo = Db::pdo();
|
||||
|
||||
$host->add_hook($host::HOOK_ARTICLE_FILTER_ACTION, $this);
|
||||
$host->add_hook($host::HOOK_FILTER_TRIGGERED, $this);
|
||||
$host->add_hook($host::HOOK_PREFS_TAB, $this);
|
||||
|
||||
$host->add_filter_action($this, "action_discord", "Send to Discord");
|
||||
}
|
||||
|
||||
function flags() {
|
||||
return array("needs_curl" => true);
|
||||
}
|
||||
|
||||
function hook_filter_triggered($feed, $owner_uid, $article, $matched_filters, $matched_rules, &$article_filters) {
|
||||
# Don't apply to articles that have been deleted by a previous filter
|
||||
$delete = false;
|
||||
foreach($article_filters as $action_key => $action) {
|
||||
if ($action["type"] === "filter") {
|
||||
$delete = true;
|
||||
}
|
||||
if ($delete && $action["param"] === "Discord_Webhook:action_discord") {
|
||||
unset($article_filters[$action_key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function validate_webhook_url($webhook_url) {
|
||||
return (filter_var($webhook_url, FILTER_VALIDATE_URL)
|
||||
&& strpos($webhook_url, $this->discord_api_url) === 0);
|
||||
}
|
||||
|
||||
function hook_article_filter_action($article, $action) {
|
||||
if ($action == "action_discord") {
|
||||
if (!function_exists("curl_init"))
|
||||
return $article;
|
||||
|
||||
# Ignore articles that are already in the database so we only trigger the webhook once
|
||||
$csth = $this->pdo->prepare("SELECT id FROM ttrss_entries
|
||||
WHERE guid = ? OR guid = ?");
|
||||
$csth->execute([$article['guid'], $article['guid_hashed']]);
|
||||
if ($row = $csth->fetch()) {
|
||||
Debug::log("Article already in database, not triggering webhook..", Debug::$LOG_VERBOSE);
|
||||
return $article;
|
||||
}
|
||||
|
||||
$webhook_url = $this->host->get($this, 'webhook_url');
|
||||
if (!$this->validate_webhook_url($webhook_url)) {
|
||||
Debug::log("Invalid Discord webhook URL, not triggering webhook..", Debug::$LOG_VERBOSE);
|
||||
return $article;
|
||||
}
|
||||
|
||||
$payload = array();
|
||||
$payload["content"] = $article["title"] . " " . $article["link"];
|
||||
|
||||
$sth = $this->pdo->prepare("SELECT title FROM ttrss_feeds WHERE id = ?");
|
||||
$sth->execute([$article["feed"]["id"]]);
|
||||
|
||||
if ($row = $sth->fetch()) {
|
||||
$payload["username"] = $row["title"];
|
||||
}
|
||||
|
||||
$ch = curl_init($webhook_url);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
||||
|
||||
curl_exec($ch);
|
||||
curl_close($ch);
|
||||
}
|
||||
|
||||
return $article;
|
||||
}
|
||||
|
||||
function hook_prefs_tab($args)
|
||||
{
|
||||
if ($args != "prefPrefs") return;
|
||||
|
||||
$replacements = array(
|
||||
'{webhook_url}' => $this->host->get($this, 'webhook_url'),
|
||||
'{discord_api_url}' => $this->discord_api_url
|
||||
);
|
||||
|
||||
$template = file_get_contents(__DIR__."/pref_template.html");
|
||||
$template = str_replace(array_keys($replacements), array_values($replacements), $template);
|
||||
print $template;
|
||||
}
|
||||
|
||||
function save()
|
||||
{
|
||||
$this->host->set($this, 'webhook_url', $_POST['webhook_url']);
|
||||
echo __("Configuration saved");
|
||||
}
|
||||
|
||||
function api_version() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
31
pref_template.html
Normal file
31
pref_template.html
Normal file
|
@ -0,0 +1,31 @@
|
|||
<style>
|
||||
#widget_discord_webhook_url {
|
||||
width: 30em;
|
||||
}
|
||||
</style>
|
||||
<div dojoType="dijit.layout.AccordionPane" title="<i class='material-icons'>extension</i> Discord Webhook">
|
||||
<p>
|
||||
Instructions for how to create a webhook URL for a server channel can be found <a href="https://support.discordapp.com/hc/en-us/articles/228383668">here</a>.
|
||||
</p>
|
||||
<form dojoType="dijit.form.Form">
|
||||
<script type="dojo/method" event="onSubmit" args="evt">
|
||||
evt.preventDefault();
|
||||
if (this.validate()) {
|
||||
console.log(dojo.objectToQuery(this.getValues()));
|
||||
new Ajax.Request('backend.php', {
|
||||
parameters: dojo.objectToQuery(this.getValues()),
|
||||
onComplete: function(transport) {
|
||||
Notify.info(transport.responseText);
|
||||
}
|
||||
});
|
||||
//this.reset();
|
||||
}
|
||||
</script>
|
||||
<input dojoType="dijit.form.TextBox" type="hidden" name="op" value="pluginhandler">
|
||||
<input dojoType="dijit.form.TextBox" type="hidden" name="method" value="save">
|
||||
<input dojoType="dijit.form.TextBox" type="hidden" name="plugin" value="discord_webhook">
|
||||
<input dojoType="dijit.form.ValidationTextBox" id="discord_webhook_url" type="url" required="1" pattern="{discord_api_url}.+" title="{discord_api_url}..." placeholder="{discord_api_url}..." name="webhook_url" value="{webhook_url}">
|
||||
<br><br>
|
||||
<button dojoType="dijit.form.Button" type="submit">Save</button>
|
||||
</form>
|
||||
</div>
|
Loading…
Reference in a new issue