From 3a14da51e0b3ff24ba3fc403c737e2b794bd5e2c Mon Sep 17 00:00:00 2001 From: iopietro Date: Sun, 20 May 2018 21:45:14 +0200 Subject: [PATCH] Alliance forum fixes part 5 +Confederation and shared forums are now visible to the confederation alliances or selected alliances/users +Sticked topics are now displayed first +Fixed a bug that permitted to add confederated alliances/users to shared forums +Minor bug fixing --- GameEngine/Alliance.php | 39 +++++++-- GameEngine/Database.php | 120 +++++++++++++++++++++++---- GameEngine/Session.php | 9 +- Templates/Alliance/Forum/forum_2.tpl | 17 ++-- Templates/Alliance/Forum/forum_4.tpl | 2 +- Templates/Alliance/forum.tpl | 7 +- allianz.php | 28 +++---- 7 files changed, 175 insertions(+), 47 deletions(-) diff --git a/GameEngine/Alliance.php b/GameEngine/Alliance.php index fcbe1442..750f51fb 100755 --- a/GameEngine/Alliance.php +++ b/GameEngine/Alliance.php @@ -44,7 +44,7 @@ class Alliance { public $inviteArray = []; public $allianceArray = []; public $userPermArray = []; - + public function procAlliance($get) { global $session, $database; @@ -77,6 +77,25 @@ class Alliance { } } + /** + * Determines if a forum is accessible or not + * + * @param int $forumID The forum ID + * @return bool Returns if the forum is accessible or not + */ + + public function isForumAccessible($forumID){ + global $session; + + //Loop through the shared forums and try to find the passed one + foreach($session->sharedForums as $forums){ + foreach($forums as $forum){ + if($forum['id'] == $forumID) return true; + } + } + return false; + } + /** * Determines if a player can act with the forum (edit/delete/create things, etc.) * @@ -110,28 +129,36 @@ class Alliance { global $database, $session; $alliances = $users = []; - + //TODO: Reduce the code of this part and cache existing diplomacy relationship //Deduplicate alliances if(!empty($alliancesID)){ foreach($alliancesID as $alliance){ - if(!empty($alliance) && is_numeric($alliance) && $database->aExist($alliance, 'id') && $alliance != $session->alliance) $alliances[$alliance] = true; + if(!empty($alliance) && is_numeric($alliance) && $database->aExist($alliance, 'id') && $alliance != $session->alliance && empty($database->diplomacyExistingRelationships($alliance))){ + $alliances[$alliance] = true; + } } } if(!empty($alliancesName)){ foreach($alliancesName as $alliance){ - if(!empty($alliance) && !empty($allianceID = $database->getAllianceID($alliance)) && $allianceID != $session->alliance) $alliances[$allianceID] = true; + if(!empty($alliance) && !empty($allianceID = $database->getAllianceID($alliance)) && $allianceID != $session->alliance && empty($database->diplomacyExistingRelationships($allianceID))){ + $alliances[$allianceID] = true; + } } } //Deduplicate users if(!empty($usersID)){ foreach($usersID as $user) { - if(!empty($user) && is_numeric($user) && ($userAlly = $database->getUserAllianceID($user)) > 0 && $userAlly != $session->alliance && $database->getUserField($user, 'username', 0) != "[?]" && $user != $session->uid) $users[$user] = true; + if(!empty($user) && is_numeric($user) && ($userAlly = $database->getUserAllianceID($user)) > 0 && $userAlly != $session->alliance && $database->getUserField($user, 'username', 0) != "[?]" && $user != $session->uid && empty($database->diplomacyExistingRelationships($userAlly))) { + $users[$user] = true; + } } } if(!empty($usersName)){ foreach($usersName as $user){ - if(!empty($user) && !empty($userID = $database->getUserField($user, 'id', 1)) && $userID != $session->uid && ($userAlly = $database->getUserAllianceID($userID)) > 0 && $userAlly != $session->alliance) $users[$userID] = true; + if(!empty($user) && !empty($userID = $database->getUserField($user, 'id', 1)) && $userID != $session->uid && ($userAlly = $database->getUserAllianceID($userID)) > 0 && $userAlly != $session->alliance && empty($database->diplomacyExistingRelationships($userAlly))) { + $users[$userID] = true; + } } } diff --git a/GameEngine/Database.php b/GameEngine/Database.php index e24e764f..11277809 100755 --- a/GameEngine/Database.php +++ b/GameEngine/Database.php @@ -627,7 +627,7 @@ class MYSQLi_DB implements IDbConnection { function mysqli_fetch_all($result) { list($result) = $this->escape_input($result); - $all = array(); + $all = []; if($result) { while($row = mysqli_fetch_assoc($result)) { $all[] = $row; @@ -2250,12 +2250,105 @@ class MYSQLi_DB implements IDbConnection { return $this->getVillageByWorldID($wref, $use_cache); } + /** + * Get shared forums (and confederation forums), based on user ID and alliance ID + * + * @param int $uid The user ID + * @param int $alliance The alliance ID + * @return array Returns all user's shared forums + */ + + function getSharedForums($uid, $alliance){ + list($uid, $alliance) = $this->escape_input((int) $uid, (int) $alliance); + + $allianceForums = $confForums = $closedForums = []; + + $q = "SELECT * FROM + ".TB_PREFIX."forum_cat + WHERE + display_to_alliances + LIKE + '%,$alliance,%' + OR + display_to_alliances + LIKE + '%,$alliance%' + OR + display_to_alliances + LIKE + '%$alliance,%' + OR + display_to_alliances + LIKE + '%$alliance%' + OR + display_to_users + LIKE + '%,$uid,%' + OR + display_to_users + LIKE + '%,$uid%' + OR + display_to_users + LIKE + '%$uid,%' + OR + display_to_users + LIKE + '%$uid%' + "; + $result = mysqli_query($this->dblink, $q); + while($row = mysqli_fetch_assoc($result)) { + switch($row['forum_area']){ + case 0: $allianceForums[] = $row; break; + case 2: $confForums[] = $row; break; + case 3: $closedForums[] = $row; break; + } + } + + //Get the alliance confederation forums + if($alliance > 0){ + $confederations = $this->diplomacyExistingRelationships($alliance); + if(!empty($confederations)){ + foreach($confederations as $confederation){ + if($confederation['type'] == 1){ + $confederationForums = $this->ForumCat($confederation['alli1'] == $alliance ? $confederation['alli2'] : $confederation['alli1'], 1); + if(!empty($confederationForums)){ + foreach($confederationForums as $forum){ + if($forum['forum_area'] == 2) $confForums[] = $forum; + } + } + } + } + } + } + + return ['alliance' => $allianceForums, 'confederation' => $confForums, 'closed' => $closedForums]; + } + + /** + * Get the total amount of the wanted forum, based on alliance and the forum area + * + * @param int $forumArea The forum Area 0 = alliance, 1 = public, 2 = confederation, 3 = closed + * @param int $ally The alliance ID + * @return int Returns the total amount of the wanted forum + */ + + function countForums($forumArea, $ally){ + list($forumArea, $ally) = $this->escape_input((int) $forumArea, (int) $ally); + + $q = "SELECT Count(*) as Total FROM ".TB_PREFIX."forum_cat WHERE ".($ally != -1 ? "alliance = $ally AND" : "")." forum_area = $forumArea"; + $result = mysqli_fetch_array(mysqli_query($this->dblink, $q), MYSQLI_ASSOC ); + return $result['Total']; + } + // no need to refactor this method function CheckForum($id) { list($id) = $this->escape_input((int) $id); $q = "SELECT Count(*) as Total FROM " . TB_PREFIX . "forum_cat where alliance = $id"; - $result = mysqli_fetch_array(mysqli_query($this->dblink,$q), MYSQLI_ASSOC); + $result = mysqli_fetch_array(mysqli_query($this->dblink, $q), MYSQLI_ASSOC); return $result['Total'] > 0; } @@ -2366,10 +2459,10 @@ class MYSQLi_DB implements IDbConnection { } // no need to cache this method - function ForumCat($id) { - list($id) = $this->escape_input($id); + function ForumCat($id, $mode = 0) { + list($id, $mode) = $this->escape_input($id, $mode); - $q = "SELECT * from " . TB_PREFIX . "forum_cat where alliance = '$id' OR forum_area = 1 ORDER BY sorting DESC, id"; + $q = "SELECT * from " . TB_PREFIX . "forum_cat where alliance = '$id' ".(!$mode ? "OR forum_area = 1" : "")." ORDER BY sorting DESC, id"; $result = mysqli_query($this->dblink,$q); return $this->mysqli_fetch_all($result); } @@ -3179,16 +3272,13 @@ class MYSQLi_DB implements IDbConnection { $array = $this->query_return($q); $text = ""; - if ($array) { - foreach($array as $row){ - if($row['alli1'] == $aid){ - $alliance = $this->getAlliance($row['alli2']); - }elseif($row['alli2'] == $aid){ - $alliance = $this->getAlliance($row['alli1']); - } - $text .= ""; - $text .= "".$alliance['tag']."
"; - } + if($array){ + foreach($array as $row){ + if($row['alli1'] == $aid) $alliance = $this->getAlliance($row['alli2']); + elseif($row['alli2'] == $aid) $alliance = $this->getAlliance($row['alli1']); + $text .= ""; + $text .= "" . $alliance['tag'] . "
"; + } } if(strlen($text) == 0){ $text = "-
"; diff --git a/GameEngine/Session.php b/GameEngine/Session.php index 0846526d..03047d72 100755 --- a/GameEngine/Session.php +++ b/GameEngine/Session.php @@ -70,10 +70,11 @@ class Session { var $bonus3 = 0; var $bonus4 = 0; var $timer = 0; + var $sharedForums = []; var $checker, $mchecker; - public $userinfo = array(); - private $userarray = array(); - var $villages = array(); + public $userinfo = []; + private $userarray = []; + var $villages = []; function __construct() { global $database; //TienTN fix @@ -238,6 +239,7 @@ class Session { private function PopulateVar() { global $database; + $this->userarray = $this->userinfo = $database->getUserArray($_SESSION['username'], 0); $this->username = $this->userarray['username']; $this->uid = $_SESSION['id_user'] = $this->userarray['id']; @@ -257,6 +259,7 @@ class Session { $this->cp = floor($this->userarray['cp']); $this->gold = $this->userarray['gold']; $this->oldrank = $this->userarray['oldrank']; + $this->sharedForums = $database->getSharedForums($this->uid, $this->alliance); $_SESSION['ok'] = $this->userarray['ok']; if($this->userarray['b1'] > $this->time) { $this->bonus1 = 1; diff --git a/Templates/Alliance/Forum/forum_2.tpl b/Templates/Alliance/Forum/forum_2.tpl index fc6657ee..ab5d7f24 100644 --- a/Templates/Alliance/Forum/forum_2.tpl +++ b/Templates/Alliance/Forum/forum_2.tpl @@ -13,12 +13,17 @@ if($session->access == BANNED){ $opt = $database->getAlliPermissions($session->uid, $aid); $displayarray = $database->getUserArray($session->uid, 1); $forumcat = $database->ForumCat(htmlspecialchars($displayarray['alliance'])); -$ally = $session->alliance; -$public = mysqli_fetch_array(mysqli_query($database->dblink, "SELECT Count(*) as Total FROM ".TB_PREFIX."forum_cat WHERE forum_area = 1"), MYSQLI_ASSOC); -$confederation = mysqli_fetch_array(mysqli_query($database->dblink, "SELECT Count(*) as Total FROM ".TB_PREFIX."forum_cat WHERE alliance = $ally AND forum_area = 2"), MYSQLI_ASSOC); -$alliance = mysqli_fetch_array(mysqli_query($database->dblink, "SELECT Count(*) as Total FROM ".TB_PREFIX."forum_cat WHERE alliance = $ally AND forum_area = 0"), MYSQLI_ASSOC); -$closed = mysqli_fetch_array(mysqli_query($database->dblink, "SELECT Count(*) as Total FROM ".TB_PREFIX."forum_cat WHERE alliance = $ally AND forum_area = 3"), MYSQLI_ASSOC); -$countArray = [$alliance['Total'], $public['Total'], $confederation['Total'], $closed['Total']]; + +$forumcat = array_merge($forumcat, + $session->sharedForums['alliance'], + $session->sharedForums['confederation'], + $session->sharedForums['closed']); + +$countArray = [$database->countForums(0, $session->alliance) + count($session->sharedForums['alliance']), + $database->countForums(1, -1), + $database->countForums(2, $session->alliance) + count($session->sharedForums['confederation']), + $database->countForums(3, $session->alliance) + count($session->sharedForums['closed'])]; + $forumArea = ["Alliance Forum(s)", "Public Forum(s)", "Confederation Forum(s)", "Closed Forum(s)"]; foreach($countArray as $index => $count){ diff --git a/Templates/Alliance/Forum/forum_4.tpl b/Templates/Alliance/Forum/forum_4.tpl index d8cc4d6c..14b7f4f9 100644 --- a/Templates/Alliance/Forum/forum_4.tpl +++ b/Templates/Alliance/Forum/forum_4.tpl @@ -19,7 +19,7 @@ if(empty($CatName)) $alliance->redirect($_GET); $opt = $database->getAlliPermissions($session->uid, $aid); $ChckTopic = $database->CheckCatTopic($cat_id); -$Topics = array_merge($database->ForumCatTopic($cat_id), $database->ForumCatTopicStick($cat_id)); +$Topics = array_merge($database->ForumCatTopicStick($cat_id), $database->ForumCatTopic($cat_id)); ?>

Alliance ->

diff --git a/Templates/Alliance/forum.tpl b/Templates/Alliance/forum.tpl index 8d08ca63..1f4b3f9f 100644 --- a/Templates/Alliance/forum.tpl +++ b/Templates/Alliance/forum.tpl @@ -83,7 +83,9 @@ if(isset($_POST['editforum']) && if(isset($_POST['newtopic']) && isset($_POST['thema']) && isset($_POST['text']) && isset($_POST['fid']) && !empty($_POST['thema']) && !empty($_POST['text']) && !empty($_POST['fid']) && - (($forumData = reset($database->ForumCatEdit($_POST['fid'])))['alliance'] == $session->alliance || $forumData['forum_area'] == 1)){ + (($forumData = reset($database->ForumCatEdit($_POST['fid'])))['alliance'] == $session->alliance || + $forumData['forum_area'] == 1 || $alliance->isForumAccessible($_POST['fid']))) +{ $title = $_POST['thema']; $text = $_POST['text']; $cat = $_POST['fid']; @@ -115,7 +117,8 @@ if(isset($_POST['newtopic']) && isset($_POST['thema']) && isset($_POST['text']) if(isset($_POST['newpost']) && isset($_POST['text']) && !empty($_POST['text']) && isset($_POST['tid']) && !empty($_POST['tid']) && isset($_POST['fid2']) && !empty($_POST['fid2']) && - (($forumData = reset($database->ForumCatEdit($_POST['fid2'])))['alliance'] == $session->alliance || $forumData['forum_area'] == 1)) + (($forumData = reset($database->ForumCatEdit($_POST['fid2'])))['alliance'] == $session->alliance || + $forumData['forum_area'] == 1 || $alliance->isForumAccessible($_POST['fid2']))) { $text = $_POST['text']; $tids = $_POST['tid']; diff --git a/allianz.php b/allianz.php index e44aaa73..881ac04a 100644 --- a/allianz.php +++ b/allianz.php @@ -35,13 +35,13 @@ if(isset($_GET['fid']) || isset($_GET['fid2'])){ $fid = preg_replace("/[^0-9]/","",!empty($_GET['fid']) ? $_GET['fid'] : $_GET['fid2']); $forum_type = reset($database->ForumCatEdit($fid)); if (!empty($forum_type)) { - if(!empty($forum_type['forum_name']) && $forum_type['forum_area'] != 1){ + if($forum_type['forum_area'] != 1 && !$alliance->isForumAccessible($fid)){ if($forum_type['alliance'] != $session->alliance){ header("Location: ".$_SERVER['PHP_SELF']); exit; } } - } + } } if(isset($_GET['aid']) || isset($_GET['fid']) || isset($_GET['fid2']) || $session->alliance > 0 || ($session->alliance == 0 && isset($_GET['s']) && $_GET['s'] == 2)){ @@ -50,33 +50,33 @@ if(isset($_GET['aid']) || isset($_GET['fid']) || isset($_GET['fid2']) || <?php - echo SERVER_NAME . ' » » » Alliance '; + echo SERVER_NAME.' » » » Alliance '; if(!empty($_GET['s'])){ switch($_GET['s']){ case '2' : if($session->alliance == 0) echo 'Forum (No alliance)'; - else echo 'Forum (' . $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name'] . ')'; + else echo 'Forum ('.$alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name'].')'; break; case '6' : - echo 'Chat (' . $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name'] . ')'; + echo 'Chat ('.$alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name'].')'; break; case '3' : - echo 'Attacks (' . $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name'] . ')'; + echo 'Attacks ('.$alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name'].')'; break; case '4' : - echo 'News (' . $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name'] . ')'; + echo 'News ('.$alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name'].')'; break; case '5' : - echo 'Options (' . $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name'] . ')'; + echo 'Options ('.$alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name'].')'; break; } } - else echo $alliance->allianceArray['tag'] . ' - ' . $alliance->allianceArray['name']; + else echo $alliance->allianceArray['tag'].' - '.$alliance->allianceArray['name']; ?> @@ -102,12 +102,12 @@ if(isset($_GET['aid']) || isset($_GET['fid']) || isset($_GET['fid2']) || if($session->gpack == null || GP_ENABLE == false) { echo " - - "; + + "; } else { echo " - - "; + + "; } ?> @@ -205,7 +205,7 @@ $userPermissions = $database->getAlliPermissions($session->uid, $session->allian } // Options }else{ - header("Location: " . $_SERVER['PHP_SELF']); + header("Location: ".$_SERVER['PHP_SELF']); exit(); } }else if(isset($_GET['delinvite'])){