This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/site/main/handlers/links.inc

172 lines
4.2 KiB
PHP

<?php
class page_handler {
var $needsAuth = false;
var $ajax = array();
function makeLinksList() {
$categories = $this->lib->call('getCategories');
for ($i=0;$i<count($categories);$i++) {
$categories[$i]['links'] = $this->lib->call('getLinks', $categories[$i]['id']);
}
$this->data = array(
"mode" => 0,
"data" => $categories
);
}
function handleBrokenReport($account, $link, $confirm) {
// Get existing reports
$reports = $this->lib->call('getBrokenReports');
$myReports = array();
foreach ($reports as $r) {
if ($r['reported_by'] == $account) {
array_push($myReports, $r['link']);
}
}
if (is_null($link) || $link == "") {
// No link reported yet, get the list
$links = array();
$categories = $this->lib->call('getCategories');
foreach ($categories as $cat) {
$clinks = $this->lib->call('getLinks', $cat['id']);
foreach ($clinks as $lnk) {
if (in_array($lnk['id'], $myReports)) {
continue;
}
$links[$lnk['id']] = utf8entities($cat['title'] . " -> " . $lnk['title']);
}
}
$this->data = array(
"mode" => 1,
"data" => $links
);
} elseif ($confirm == '') {
// A link has been reported, but the report hasn't been confirmed yet
$lk = $this->lib->call('getLink', (int)$link);
if (is_null($lk) || in_array((int)$link, $myReports)) {
return;
}
$cat = $this->lib->call('getCategory', $lk['category']);
$lk['long_title'] = utf8entities($cat['title'] . " -> " . $lk['title']);
$this->data = array(
"mode" => 2,
"data" => $lk
);
} else {
// A link has been reported and the user confirmed
$lk = $this->lib->call('getLink', (int)$link);
if (is_null($lk) || in_array((int)$link, $myReports)) {
return;
}
$cat = $this->lib->call('getCategory', $lk['category']);
$lk['long_title'] = utf8entities($cat['title'] . " -> " . $lk['title']);
$this->lib->call('reportBroken', (int)$link, $account);
$this->data = array(
"mode" => 3,
"data" => $lk
);
}
}
function handleSubmission(&$input) {
$sl = (int)$input['sl'];
if ($sl == 1) {
// Initialise the form
$this->data = array(
"mode" => 4,
"data" => array(
"url" => "http://",
"title" => "",
"desc" => "",
"err" => 0
)
);
} elseif ($sl == 2) {
// Check submitted data
$title = preg_replace('/\s+/', ' ', trim($input['title']));
$desc = preg_replace('/\s+/', ' ', trim($input['desc']));
$url = trim($input['url']);
// Check title
if (strlen($title) < 5) {
$error = 1;
} elseif (strlen($title) > 64) {
$error = 2;
// Check description
} elseif ($desc != "" && strlen($desc) < 10) {
$error = 3;
// Check URL
} elseif (!preg_match('/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?(\/.*)?$/i', $url, $m)) {
$error = 4;
} else {
list($junk, $proto, $hostname, $port) = $m;
if (!preg_match('/^\d+\.\d+\.\d+\.\d+$/', $hostname)) {
$ip = gethostbyname($hostname);
if ($ip === $hostname) {
$error = 5;
} else {
$error = 0;
}
} else {
$error = 0;
}
}
// If there was no error, check whether this user already submitted the link
if ($error == 0 && !$this->lib->call('checkSubmission', $url, $_SESSION['userid'])) {
$error = 6;
}
// Generate output
if ($error) {
$this->data = array(
"mode" => 4,
"data" => array(
"url" => $url,
"title" => $title,
"desc" => $desc,
"err" => $error
)
);
} else {
$this->lib->call('submitLink', $url, $title, $desc == "" ? null : $desc, $_SESSION['userid']);
$this->data = array(
"mode" => 5,
"data" => $url
);
}
}
}
function handle($input) {
$this->lib = $this->game->getLib('main/links');
if (is_array($_SESSION) && !is_null($_SESSION['userid'])) {
$account = $_SESSION['userid'];
if (!is_null($input['rbl']) && is_null($input['cancel'])) {
$this->handleBrokenReport($account, $input['id'], $input['confirm']);
} elseif (!is_null($input['sl']) && is_null($input['cancel'])) {
$this->handleSubmission($input);
}
}
if (is_null($this->data)) {
$this->makeLinksList();
}
$this->output = "links";
}
}
?>