added superexpert mode

This commit is contained in:
Frank Schubert
2024-03-07 15:33:59 +01:00
parent 39478b9fb9
commit 2df2ca22a1
6 changed files with 269 additions and 8 deletions

View File

@@ -7,7 +7,7 @@
<div class="container-fluid">
<div class="row">
<div class="col-md-6 <?=(MFAPPNAME == "devthetool") ? "text-danger" : ""?>">
<span title="<?=MFAPPNAME?>">the tool &copy; <?=date('Y')?></span> <a href="https://www.xinon.at">Xinon GmbH</a>
<span title="<?=MFAPPNAME?>">the to<span class="secondO">o</span>l &copy; <?=date('Y')?></span> <a href="https://www.xinon.at">Xinon GmbH</a>
</div>
</div>
@@ -36,6 +36,111 @@
$(this).parent('li').toggleClass('open').find('.submenu:first').toggleClass('open');
}
});
<?php if($me->can("Superexpert")): ?>
$(".secondO").addClass("pointer");
var se_to = 0;
var se_intv;
var se_notf;
$(".footer .secondO").click(function() {
if(!se_to) {
$.post("<?=self::getUrl("User", "api")?>",{
do: "sse"
},
function(success) {
if(!("status" in success)) return;
if(success.status == "OK") {
if(!("result" in success)) return;
if(!("valid_to" in success.result) || !success.result.valid_to) return;
se_to = success.result.valid_to;
addSeMark();
se_intv = setInterval(checkSe, 1000);
location.reload();
}
},
"json");
}
});
function checkSe() {
var now = Math.floor(Date.now() / 1000);
if(!se_to || se_to < 0) {
clearInterval(se_intv);
se_to = null;
$("#se_notf").remove();
removeSeMark();
return;
}
var rest_duration = se_to - now;
if(rest_duration <= 0) {
clearInterval(se_intv);
se_to = null;
$("#se_notf").remove();
removeSeMark();
return;
}
if(rest_duration < 60*5) {
// show notification
if($("#se_notf").length) {
$("#se_notf .time").text(rest_duration);
} else {
var notf_html = $('<div class="fixed-top alert alert-warning mx-4 mt-3" id="se_notf" style="width: 50vh;">Achtung: Noch <span class="time">' + rest_duration +'</span> Sekunden. <a href="#" onclick="extSe()">Jetzt verlängern!</a></div>');
$("body").prepend(notf_html);
}
}
}
function extSe() {
console.log("in ese");
$.post("<?=self::getUrl("User", "api")?>", {
do: "ese"
},
function(success) {
if(!("result" in success)) return;
if(!("valid_to" in success.result) || !success.result.valid_to) return;
se_to = success.result.valid_to;
},
"json"
);
}
function endSe() {
$.post("<?=self::getUrl("User", "api")?>", {
do: "endse"
},
function(success) {
if(!("result" in success)) return;
if(!("valid_to" in success.result)) return;
se_to = success.result.valid_to;
location.reload();
},
"json"
);
}
function addSeMark() {
if(!$("#se-mark").length) {
$("#topbar").append('<li id="SeMark"><a class="nav-link dropdown-toggle text-danger" href="#" role="button" aria-haspopup="false" aria-expanded="false" onclick="endSe(); return false;" title="Beenden"><i class="fas fa-crown"></i></a></li>');
}
}
function removeSeMark() {
$("#SeMark").remove();
}
<?php if($me->superexpertEnabled()): ?>
addSeMark();
if(!se_intv) {
se_to = <?=$me->flags["superexpert_lock_date"]?>;
setInterval(checkSe, 1000);
}
<?php endif; ?>
<?php endif; ?>
</script>
</body>
</html>

View File

@@ -1,7 +1,7 @@
<!-- Topbar Start -->
<div class="navbar-custom">
<div class="container-fluid">
<ul class="list-unstyled topnav-menu float-right mb-0">
<ul class="list-unstyled topnav-menu float-right mb-0" id="topbar">
<li class="dropdown notification-list">
<!-- Mobile menu toggle-->

View File

@@ -144,6 +144,62 @@ class User extends mfBaseModel {
return true;
}
public function superexpertStart($duration = 1800) {
if(!$this->can("Superexpert")) return false;
$ts = $this->getFlag("superexpert_lock_date");
$ts->value(date("U") + $duration);
$ts->save();
return true;
}
public function superexpertStop($duration = 1800) {
if(!$this->can("Superexpert")) return false;
$ts = $this->getFlag("superexpert_lock_date");
$ts->value(0);
$ts->save();
return true;
}
public function superexpertExtend($duration = 1800) {
if(!$this->can("Superexpert")) return false;
$ts = $this->getFlag("superexpert_lock_date");
$ts->value(date("U") + $duration);
$ts->save();
return true;
}
public function superexpertEnabled() {
if(!$this->can("Superexpert")) return false;
$tsFlag = $this->getFlag("superexpert_lock_date");
$ts = $tsFlag->value();
if(!is_numeric($ts) || !$ts) {
return false;
}
$now = date("U");
// if superexpert is longer than 60 minutes -> disable
if($ts > $now + 3601) {
$tsFlag->value(null);
$tsFlag->save();
return false;
}
if($ts > $now) {
return true;
}
return false;
}
public function getFlag($name) {
return new WorkerFlag($this->id, $name);
}

View File

@@ -110,7 +110,6 @@ class UserController extends mfBaseController
}
protected function saveAction()
{
$r = $this->request;
@@ -342,4 +341,75 @@ class UserController extends mfBaseController
return $me->isAdmin();
}
protected function apiAction() {
if(!$this->me->is(["Admin"])) {
$this->redirect("Dashboard");
}
$do = $this->request->do;
$data = [];
switch($do) {
case "sse":
$return = $this->startSuperexpertApi();
break;
case "ese":
$return = $this->extendSuperexpertApi();
break;
case "endse":
$return = $this->endSuperexpertApi();
break;
default:
$return = false;
}
if(!is_array($return) || !count($return)) {
$data = ["status" => "error"];
$this->returnJson($data);
}
$data['status'] = "OK";
$data['result'] = $return;
$this->returnJson($data);
}
private function startSuperexpertApi() {
$me = new User();
$me->loadMe();
if($me->superexpertEnabled() ) {
// superexpert mode started already
return false;
}
$me->superexpertStart(1800);
return ["valid_to" => $me->getFlag("superexpert_lock_date")->value()];
}
private function extendSuperexpertApi() {
$me = new User();
$me->loadMe();
if(!$me->superexpertEnabled() ) {
// superexpert mode must be started already
$this->log->debug("se not started");
return false;
}
$this->log->debug("ese");
$me->superexpertExtend(1800);
return ["valid_to" => $me->getFlag("superexpert_lock_date")->value()];
}
private function endSuperexpertApi() {
$me = new User();
$me->loadMe();
if($me->superexpertEnabled() ) {
$me->superexpertStop();
}
return ["valid_to" => null];
}
}

View File

@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class WorkerPermissionAddcanSuperexpert extends AbstractMigration
{
public function up(): void
{
if($this->getEnvironment() == "thetool") {
$table = $this->table("WorkerPermission");
$table->addColumn("canSuperexpert", "enum", ["null" => false,"values" => 'false,true', "default" => "false", "after" => "canStatistics"]);
$table->update();
}
if($this->getEnvironment() == "addressdb") {
}
}
public function down(): void
{
if($this->getEnvironment() == "thetool") {
$this->table("WorkerPermission")->removeColumn("canSuperexpert")->save();
}
if($this->getEnvironment() == "addressdb") {
}
}
}

View File

@@ -15,6 +15,5 @@ $me = new User(1);
define("INTERNAL_USER_ID", $me->id);
define("INTERNAL_USER_USERNAME", $me->username);
foreach(PreorderModel::searchActive(["adb_hausnummer_id" => 1788466, "<status_code" => 145]) as $preorder) {
echo $preorder->id."\n";
}
$netzgebiet = new ADBNetzgebiet(45);
var_dump($netzgebiet->getOption("hausnummer_dont_overwrite_netzgebiet"));