90 lines
3.6 KiB
PHP
90 lines
3.6 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Mcp\Cron;
|
|
|
|
use Mcp\OpenSim;
|
|
use Mcp\Util\SmtpClient;
|
|
|
|
use SimpleXMLElement;
|
|
|
|
class OfflineIm extends CronJob
|
|
{
|
|
private const IM_TYPE = array(
|
|
"0" => "eine Nachricht",
|
|
"3" => "eine Gruppeneinladung",
|
|
"4" => "ein Inventaritem",
|
|
"5" => "eine Bestätigung zur Annahme von Inventar",
|
|
"6" => "eine Information zur Ablehnung von Inventar",
|
|
"7" => "eine Aufforderung zur Gruppenwahl",
|
|
"9" => "ein Inventaritem von einem Script",
|
|
"19" => "eine Nachricht von einem Script",
|
|
"32" => "eine Gruppennachricht",
|
|
"38" => "eine Freundschaftsanfrage",
|
|
"39" => "eine Bestätigung über die Annahme der Freundschaft",
|
|
"40" => "eine Information über das Ablehnen der Freundschaft"
|
|
);
|
|
|
|
public function __construct(\Mcp\Mcp $app)
|
|
{
|
|
parent::__construct($app, Frequency::EACH_MINUTE);
|
|
}
|
|
|
|
public function run(): bool
|
|
{
|
|
$statement = $this->app->db()->prepare("SELECT ID,PrincipalID,Message FROM im_offline");
|
|
$statement->execute();
|
|
|
|
while ($row = $statement->fetch()) {
|
|
$opensim = new OpenSim($this->app->db());
|
|
|
|
$email = $opensim->getUserMail($row['PrincipalID']);
|
|
$allowOfflineIM = $opensim->allowOfflineIM($row['PrincipalID']);
|
|
|
|
if ($email != "" && $allowOfflineIM == "TRUE" && !$this->isMailAlreadySent($row['ID'])) {
|
|
$statementSend = $this->app->db()->prepare('INSERT INTO mcp_offlineim_send (id) VALUES (:idnummer)');
|
|
$statementSend->execute(['idnummer' => $row['ID']]);
|
|
|
|
$mailcfg = $this->app->config('smtp');
|
|
$smtpClient = new SmtpClient($mailcfg['host'], intval($mailcfg['port']), $mailcfg['address'], $mailcfg['password']);
|
|
|
|
$xmlMessage = new SimpleXMLElement($row['Message']);
|
|
|
|
$imType = $this::IM_TYPE["" . $xmlMessage->dialog . ""];
|
|
$htmlMessage = "Du hast " . $imType . " in " . $this->app->config('grid')['name'] . " bekommen. <br><p><ul><li>" . htmlspecialchars($xmlMessage->message) . "</li></ul></p>Gesendet von: ";
|
|
|
|
if (isset($xmlMessage->fromAgentName)) {
|
|
$htmlMessage .= $xmlMessage->fromAgentName;
|
|
}
|
|
|
|
if (isset($xmlMessage->RegionID) && isset($xmlMessage->Position)) {
|
|
if ($xmlMessage->Position->X != 0 || $xmlMessage->Position->Y != 0 || $xmlMessage->Position->Z != 0) { //TODO
|
|
$htmlMessage .= " @ " . $opensim->getRegionName($xmlMessage->RegionID) . "/" . $xmlMessage->Position->X . "/" . $xmlMessage->Position->Y . "/" . $xmlMessage->Position->Z;
|
|
} else {
|
|
$htmlMessage .= " @ " . $opensim->getRegionName($xmlMessage->RegionID);
|
|
}
|
|
}
|
|
|
|
$tpl = $this->app->template('mail.php')->vars([
|
|
'title' => substr($imType, strpos($imType, ' '))
|
|
])->unsafeVar('message', $htmlMessage);
|
|
$smtpClient->sendHtml($mailcfg['address'], $mailcfg['name'], $email, "Du hast " . $imType . " in " . $this->app->config('grid')['name'] . ".", $tpl);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private function isMailAlreadySent($id): bool
|
|
{
|
|
$statement = $this->app->db()->prepare("SELECT 1 FROM mcp_offlineim_send WHERE id = ? LIMIT 1");
|
|
$statement->execute(array($id));
|
|
|
|
if ($statement->rowCount() != 0) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
}
|