integrated state system for wizard, updated system reference
This commit is contained in:
parent
1341413869
commit
18579eeba9
@ -6,7 +6,7 @@ class charcreation {
|
|||||||
const DEFAULT_CHAR_CLASS = 0;
|
const DEFAULT_CHAR_CLASS = 0;
|
||||||
const MOJO_CC_SESSIONKEY = 'mojo_charcreation';
|
const MOJO_CC_SESSIONKEY = 'mojo_charcreation';
|
||||||
const DEFAULT_CHAR_APPEARANCE = 0;
|
const DEFAULT_CHAR_APPEARANCE = 0;
|
||||||
public static function data($json = NULL){
|
public static function data($json = NULL, $returnasjson = true){
|
||||||
if(!\SYSTEM\SECURITY\Security::load(self::MOJO_CC_SESSIONKEY)){
|
if(!\SYSTEM\SECURITY\Security::load(self::MOJO_CC_SESSIONKEY)){
|
||||||
\SYSTEM\SECURITY\Security::save(self::MOJO_CC_SESSIONKEY, self::session_default());}
|
\SYSTEM\SECURITY\Security::save(self::MOJO_CC_SESSIONKEY, self::session_default());}
|
||||||
//write
|
//write
|
||||||
@ -17,7 +17,7 @@ class charcreation {
|
|||||||
call_user_func('charcreation_validator::'.$key,$value);}
|
call_user_func('charcreation_validator::'.$key,$value);}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return JsonResult::toString(\SYSTEM\SECURITY\Security::load(self::MOJO_CC_SESSIONKEY));
|
return $returnasjson ? JsonResult::toString(\SYSTEM\SECURITY\Security::load(self::MOJO_CC_SESSIONKEY)) : \SYSTEM\SECURITY\Security::load(self::MOJO_CC_SESSIONKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function session_default(){
|
private static function session_default(){
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
class skilltree{
|
class skilltree{
|
||||||
public static function generate($class){
|
public static function generate($class){
|
||||||
|
if(!player_classes::is($class)){
|
||||||
|
return 'Choose a Class first!';}
|
||||||
$vars = \DBD\TALENT_TREE::Q1(array($class));
|
$vars = \DBD\TALENT_TREE::Q1(array($class));
|
||||||
$res = \DBD\TALENT_TREE_ICON::QA(array($class));
|
$res = \DBD\TALENT_TREE_ICON::QA(array($class));
|
||||||
$vars['tree1'] = $vars['tree2'] = $vars['tree3'] = '';
|
$vars['tree1'] = $vars['tree2'] = $vars['tree3'] = '';
|
||||||
|
|||||||
@ -51,4 +51,21 @@ class player_classes {
|
|||||||
return 'class not valid';
|
return 'class not valid';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function is($class){
|
||||||
|
switch($class){
|
||||||
|
case self::WARRIOR:
|
||||||
|
case self::PALADIN:
|
||||||
|
case self::HUNTER:
|
||||||
|
case self::ROGUE:
|
||||||
|
case self::PRIEST:
|
||||||
|
case self::SHAMAN:
|
||||||
|
case self::MAGE:
|
||||||
|
case self::WARLOCK:
|
||||||
|
case self::DRUID:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -10,21 +10,14 @@ class default_page extends SYSTEM\PAGE\Page {
|
|||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PLIB(),'hashmask/jquery.md5.js').'"></script>'.
|
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PLIB(),'hashmask/jquery.md5.js').'"></script>'.
|
||||||
'<script src="https://www.google.com/jsapi" type="text/javascript"></script>'.
|
'<script src="https://www.google.com/jsapi" type="text/javascript"></script>'.
|
||||||
'<script type="text/javascript">google.load("visualization", "1", {packages:["corechart"]});</script>'.
|
'<script type="text/javascript">google.load("visualization", "1", {packages:["corechart"]});</script>'.
|
||||||
'<script type="text/javascript" language="JavaScript" src="./api.php?call=files&cat=sys_js&id=system.js"></script>'.
|
'<script type="text/javascript" language="JavaScript" src="./api.php?call=files&cat=sys&id=system.js"></script>'.
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/js/wizard.js').'"></script>'.
|
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/js/wizard.js').'"></script>';
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/js/onlinegraphic.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'wizard_details/js/wizard_details.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'wizard_visuals/js/wizard_visuals.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PAPI(),'char/js/skilltree.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'wizard_skills/js/wizard_skills.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'wizard_spawn/js/wizard_spawn.js').'"></script>'.
|
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'wizard_toolbar/js/wizard_toolbar.js').'"></script>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function css (){
|
private function css (){
|
||||||
return '<link href="'.SYSTEM\WEBPATH(new PLIB(),'bootstrap/css/bootstrap.css').'" rel="stylesheet">'.
|
return '<link href="'.SYSTEM\WEBPATH(new PLIB(),'bootstrap/css/bootstrap.css').'" rel="stylesheet">'.
|
||||||
'<link href="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/css/default_page.css').'" rel="stylesheet">'.
|
'<link href="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/css/default_page.css').'" rel="stylesheet">'.
|
||||||
'<link href="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/css/font.css').'" rel="stylesheet">'.
|
//'<link href="'.SYSTEM\WEBPATH(new PPAGE(),'default_page/css/font.css').'" rel="stylesheet">'.
|
||||||
'<link href="'.SYSTEM\WEBPATH(new PAPI(),'char/css/skilltree.css').'" rel="stylesheet">';
|
'<link href="'.SYSTEM\WEBPATH(new PAPI(),'char/css/skilltree.css').'" rel="stylesheet">';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
var visual_id = null;
|
|
||||||
function load_visualisation(id){
|
|
||||||
visual_id = id;
|
|
||||||
sys.call('call=stats',handle_visualisation_result,{},'json',true);
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle_visualisation_result(json){
|
|
||||||
if(!json || json.status !== true || !json.result){
|
|
||||||
return;}
|
|
||||||
json = json.result;
|
|
||||||
var data = new google.visualization.DataTable();
|
|
||||||
first = true;
|
|
||||||
$.each(json[0], function(key, value){
|
|
||||||
if(first){
|
|
||||||
data.addColumn('datetime',key);
|
|
||||||
first = false;
|
|
||||||
} else {
|
|
||||||
data.addColumn('number',key);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$.each(json, function(key, value){first = true; data.addRow($.map(value, function(v) { if(first){first=false;return [new Date(v)];}else{return [(v == null || parseFloat(v) <= 0) ? 0 : parseFloat(v)];}}));});
|
|
||||||
|
|
||||||
var options = {title: visual_id, backgroundColor: 'darkslategrey', aggregationTarget: 'category', selectionMode: 'multiple', curveType: 'function', /*focusTarget: 'category',*/ chartArea:{left:20,top:40}, interpolateNulls: false, height: "200"};
|
|
||||||
new google.visualization.LineChart(document.getElementById(visual_id)).draw(data, options);
|
|
||||||
}
|
|
||||||
@ -1,37 +1,8 @@
|
|||||||
var sys = null;
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
sys = new SYSTEM('./api.php',1);
|
new SYSTEM('./api.php',1,'start');
|
||||||
sys.go_state('start');
|
|
||||||
//sys.load();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function sendInfo(json,toolbar){
|
function sendInfo(json,toolbar){
|
||||||
sys.call('call=charcreation&json='+json,
|
system.call('call=charcreation&json='+json,
|
||||||
function(){sys.load(toolbar)},
|
function(){system.load(toolbar)},
|
||||||
{},'json',false);}
|
{},'json',false);}
|
||||||
|
|
||||||
function init_start(){
|
|
||||||
register_login();
|
|
||||||
load_visualisation('mojopulse');
|
|
||||||
$('#start a').click(function() {
|
|
||||||
sys.load('wizard_details');});
|
|
||||||
}
|
|
||||||
|
|
||||||
function register_login(){
|
|
||||||
$("#login_form input").not("[type=submit]").jqBootstrapValidation({
|
|
||||||
preventSubmit: true,
|
|
||||||
submitError: function($form, event, errors) {},
|
|
||||||
submitSuccess: function($form, event){
|
|
||||||
$.get('./api.php?call=account&action=login&username='+$('#bt_login_user').val()+'&password_sha='+$.sha1($('#bt_login_password').val())+'&password_md5='+$.md5($('#bt_login_password').val()), function (data) {
|
|
||||||
if(data == 1){
|
|
||||||
$('.help-block').html("Login successfull.</br>");
|
|
||||||
window.location.reload();
|
|
||||||
} else {
|
|
||||||
$('.help-block').html("Login not successfull.</br> User & Password combination wrong.")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
class default_start extends SYSTEM\PAGE\Page {
|
class default_start extends SYSTEM\PAGE\Page {
|
||||||
public static function js(){}
|
public static function js(){
|
||||||
public static function css(){}
|
return array( \SYSTEM\WEBPATH(new PPAGE(),'default_start/js/onlinegraphic.js'),
|
||||||
|
\SYSTEM\WEBPATH(new PPAGE(),'default_start/js/default_start.js'));}
|
||||||
|
public static function css(){
|
||||||
|
return array();}
|
||||||
|
|
||||||
public function html(){
|
public function html(){
|
||||||
$vars = array();
|
$vars = array();
|
||||||
|
|||||||
24
mojotrollz/page/default_start/js/default_start.js
Normal file
24
mojotrollz/page/default_start/js/default_start.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
function init_start(){
|
||||||
|
register_login();
|
||||||
|
load_visualisation('mojopulse');
|
||||||
|
$('#start a').click(function() {
|
||||||
|
system.load('wizard_details');});
|
||||||
|
}
|
||||||
|
|
||||||
|
function register_login(){
|
||||||
|
$("#login_form input").not("[type=submit]").jqBootstrapValidation({
|
||||||
|
preventSubmit: true,
|
||||||
|
submitError: function($form, event, errors) {},
|
||||||
|
submitSuccess: function($form, event){
|
||||||
|
$.get('./api.php?call=account&action=login&username='+$('#bt_login_user').val()+'&password_sha='+$.sha1($('#bt_login_password').val())+'&password_md5='+$.md5($('#bt_login_password').val()), function (data) {
|
||||||
|
if(data == 1){
|
||||||
|
$('.help-block').html("Login successfull.</br>");
|
||||||
|
window.location.reload();
|
||||||
|
} else {
|
||||||
|
$('.help-block').html("Login not successfull.</br> User & Password combination wrong.")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
23
mojotrollz/page/default_start/js/onlinegraphic.js
Normal file
23
mojotrollz/page/default_start/js/onlinegraphic.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
function load_visualisation(id){
|
||||||
|
system.call('call=stats',function handle_visualisation_result(json){
|
||||||
|
if(!json || json.status !== true || !json.result){
|
||||||
|
return;}
|
||||||
|
json = json.result;
|
||||||
|
var data = new google.visualization.DataTable();
|
||||||
|
first = true;
|
||||||
|
$.each(json[0], function(key, value){
|
||||||
|
if(first){
|
||||||
|
data.addColumn('datetime',key);
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
data.addColumn('number',key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$.each(json, function(key, value){first = true; data.addRow($.map(value, function(v) { if(first){first=false;return [new Date(v)];}else{return [(v == null || parseFloat(v) <= 0) ? 0 : parseFloat(v)];}}));});
|
||||||
|
|
||||||
|
var options = {title: id, backgroundColor: 'darkslategrey', aggregationTarget: 'category', selectionMode: 'multiple', curveType: 'function', /*focusTarget: 'category',*/ chartArea:{left:20,top:40}, interpolateNulls: false, height: "200"};
|
||||||
|
new google.visualization.LineChart(document.getElementById(id)).draw(data, options);
|
||||||
|
},
|
||||||
|
{},'json',true);
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,9 +1,6 @@
|
|||||||
var sys = null;
|
var sys = null;
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
sys = new SYSTEM('./api.php',2);
|
sys = new SYSTEM('./api.php',2,'user_start');
|
||||||
sys.go_state('user_start');
|
|
||||||
//sys.load();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function init_user_start(){}
|
function init_user_start(){}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ class user_default extends SYSTEM\PAGE\Page {
|
|||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PLIB(),'hashmask/jquery.md5.js').'"></script>'.
|
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PLIB(),'hashmask/jquery.md5.js').'"></script>'.
|
||||||
'<script src="https://www.google.com/jsapi" type="text/javascript"></script>'.
|
'<script src="https://www.google.com/jsapi" type="text/javascript"></script>'.
|
||||||
'<script type="text/javascript">google.load("visualization", "1", {packages:["corechart"]});</script>'.
|
'<script type="text/javascript">google.load("visualization", "1", {packages:["corechart"]});</script>'.
|
||||||
'<script type="text/javascript" language="JavaScript" src="./api.php?call=files&cat=sys_js&id=system.js"></script>'.
|
'<script type="text/javascript" language="JavaScript" src="./api.php?call=files&cat=sys&id=system.js"></script>'.
|
||||||
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'user_default/js/user_default.js').'"></script>';
|
'<script type="text/javascript" language="JavaScript" src="'.SYSTEM\WEBPATH(new PPAGE(),'user_default/js/user_default.js').'"></script>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
class wizard_details extends SYSTEM\PAGE\Page {
|
class wizard_details extends SYSTEM\PAGE\Page {
|
||||||
private function js(){
|
public static function js(){
|
||||||
return '';
|
return array( \SYSTEM\WEBPATH(new PPAGE(),'wizard_details/js/wizard_details.js'));}
|
||||||
}
|
|
||||||
|
|
||||||
private function css (){
|
public static function css (){
|
||||||
return '';
|
return array();}
|
||||||
}
|
|
||||||
|
|
||||||
public function html(){
|
public function html(){
|
||||||
$vars = json_decode(charcreation::data(),true)['result'];
|
$vars = json_decode(charcreation::data(),true)['result'];
|
||||||
$vars['js'] = $this->js();
|
//$vars['js'] = $this->js();
|
||||||
$vars['css'] = $this->css();
|
//$vars['css'] = $this->css();
|
||||||
$vars['WOWICONS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=wowicons&id=';
|
$vars['WOWICONS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=wowicons&id=';
|
||||||
$vars['WOW_CLASS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=class&id=';
|
$vars['WOW_CLASS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=class&id=';
|
||||||
$vars['infotext_default'] = \SYSTEM\locale::getStrings(DBD\locale_string::VALUE_CATEGORY_WOW_INFOTEXT)['default'];
|
$vars['infotext_default'] = \SYSTEM\locale::getStrings(DBD\locale_string::VALUE_CATEGORY_WOW_INFOTEXT)['default'];
|
||||||
|
|||||||
@ -1,14 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
class wizard_skills extends SYSTEM\PAGE\Page {
|
class wizard_skills extends SYSTEM\PAGE\Page {
|
||||||
|
|
||||||
private function js(){
|
public static function js(){
|
||||||
return '';
|
return array( \SYSTEM\WEBPATH(new PAPI(),'char/js/skilltree.js'),
|
||||||
}
|
\SYSTEM\WEBPATH(new PPAGE(),'wizard_skills/js/wizard_skills.js'));}
|
||||||
|
|
||||||
private function css (){
|
public static function css (){
|
||||||
return '';
|
return array();}
|
||||||
}
|
|
||||||
|
|
||||||
public function html(){
|
public function html(){
|
||||||
$vars = json_decode(charcreation::data(),true)['result'];
|
$vars = json_decode(charcreation::data(),true)['result'];
|
||||||
$vars['skilltree'] = skilltree::generate($vars['char_class']);
|
$vars['skilltree'] = skilltree::generate($vars['char_class']);
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
function wizard_toolbar(){
|
function wizard_toolbar(){
|
||||||
$('.tb_link').click(function(){sys.load($(this).attr('sysload'));});}
|
$('.tb_link').click(function(){system.load($(this).attr('sysload'));});}
|
||||||
@ -5,10 +5,16 @@ class wizard_toolbar extends SYSTEM\PAGE\Page {
|
|||||||
public $next = null;
|
public $next = null;
|
||||||
public function __construct($last,$next) {
|
public function __construct($last,$next) {
|
||||||
$this->last = $last;
|
$this->last = $last;
|
||||||
$this->next = $next;
|
$this->next = $next;}
|
||||||
}
|
|
||||||
|
public static function js(){
|
||||||
|
return array( \SYSTEM\WEBPATH(new PPAGE(),'wizard_toolbar/js/wizard_toolbar.js'));}
|
||||||
|
|
||||||
|
public static function css (){
|
||||||
|
return array();}
|
||||||
|
|
||||||
public function html(){
|
public function html(){
|
||||||
$vars = json_decode(charcreation::data(),true)['result'];
|
$vars = charcreation::data(NULL,false);
|
||||||
$vars['char_class'] = player_classes::name($vars['char_class']);
|
$vars['char_class'] = player_classes::name($vars['char_class']);
|
||||||
$vars['last'] = $this->last;
|
$vars['last'] = $this->last;
|
||||||
$vars['next'] = $this->next;
|
$vars['next'] = $this->next;
|
||||||
|
|||||||
@ -2,21 +2,17 @@
|
|||||||
|
|
||||||
class wizard_visuals extends SYSTEM\PAGE\Page {
|
class wizard_visuals extends SYSTEM\PAGE\Page {
|
||||||
|
|
||||||
private function js(){
|
public static function js(){
|
||||||
return '';
|
return array( \SYSTEM\WEBPATH(new PPAGE(),'wizard_visuals/js/wizard_visuals.js'));}
|
||||||
}
|
|
||||||
|
public static function css (){
|
||||||
private function css (){
|
return array();}
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function html(){
|
public function html(){
|
||||||
$vars = json_decode(charcreation::data(),true)['result'];
|
$vars = json_decode(charcreation::data(),true)['result'];
|
||||||
if($vars['char_race'] == 'undead'){
|
if($vars['char_race'] == 'undead'){
|
||||||
$vars['char_race'] = 'scourge';}
|
$vars['char_race'] = 'scourge';}
|
||||||
$vars['char_equip'] = '';//'1,110744,3,109807,16,111412,5,111190,9,111188,10,126342,6,110003,7,120793,8,115217,21,125312,14,110641';//
|
$vars['char_equip'] = '';//'1,110744,3,109807,16,111412,5,111190,9,111188,10,126342,6,110003,7,120793,8,115217,21,125312,14,110641';//
|
||||||
$vars['js'] = $this->js();
|
|
||||||
$vars['css'] = $this->css();
|
|
||||||
$vars['WOWICONS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=wowicons&id=';
|
$vars['WOWICONS'] = \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_PATH_BASEURL).'api.php?call=files&cat=wowicons&id=';
|
||||||
$vars['infotext_default'] = \SYSTEM\locale::getStrings(DBD\locale_string::VALUE_CATEGORY_WOW_INFOTEXT)['default'];
|
$vars['infotext_default'] = \SYSTEM\locale::getStrings(DBD\locale_string::VALUE_CATEGORY_WOW_INFOTEXT)['default'];
|
||||||
return SYSTEM\PAGE\replace::replaceFile(SYSTEM\SERVERPATH(new PPAGE(),'wizard_visuals/wizard_visuals.tpl'), $vars);
|
return SYSTEM\PAGE\replace::replaceFile(SYSTEM\SERVERPATH(new PPAGE(),'wizard_visuals/wizard_visuals.tpl'), $vars);
|
||||||
|
|||||||
2
system
2
system
@ -1 +1 @@
|
|||||||
Subproject commit b3bf40d17d3c707d7af17943b1f6ff147c0e71a6
|
Subproject commit 058d4d3b905f9b9e533e54f7b4372c49e81744a1
|
||||||
Loading…
x
Reference in New Issue
Block a user