1: <?php
2:
3: namespace Budabot\Core;
4:
5: use Exception;
6:
7: 8: 9: 10: 11:
12: class AccessManager {
13: private static $ACCESS_LEVELS = array('none' => 0, 'superadmin' => 1, 'admin' => 2, 'mod' => 3, 'guild' => 4, 'member' => 5, 'rl' => 6, 'all' => 7);
14:
15:
16: public $db;
17:
18:
19: public $setting;
20:
21:
22: public $chatBot;
23:
24:
25: public $adminManager;
26:
27:
28: public $logger;
29:
30:
31: public $altsController;
32:
33:
34: public $chatLeaderController;
35:
36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
71: public function checkAccess($sender, $accessLevel) {
72: $this->logger->log("DEBUG", "Checking access level '$accessLevel' against character '$sender'");
73:
74: $returnVal = $this->checkSingleAccess($sender, $accessLevel);
75:
76: if ($returnVal === false) {
77:
78:
79:
80:
81:
82: $altInfo = $this->altsController->getAltInfo($sender);
83: if ($sender != $altInfo->main && $altInfo->isValidated($sender)) {
84: $this->logger->log("DEBUG", "Checking access level '$accessLevel' against the main of '$sender' which is '$altInfo->main'");
85: $returnVal = $this->checkSingleAccess($altInfo->main, $accessLevel);
86: }
87: }
88:
89: return $returnVal;
90: }
91:
92: public function checkSingleAccess($sender, $accessLevel) {
93: $sender = ucfirst(strtolower($sender));
94:
95: $charAccessLevel = $this->getSingleAccessLevel($sender);
96: return ($this->compareAccessLevels($charAccessLevel, $accessLevel) >= 0);
97: }
98:
99: public function getDisplayName($accessLevel) {
100: $displayName = $this->getAccessLevel($accessLevel);
101: switch ($displayName) {
102: case "rl":
103: $displayName = "raidleader";
104: break;
105: case "mod":
106: $displayName = "moderator";
107: break;
108: case "admin":
109: $displayName = "administrator";
110: break;
111: }
112:
113: return $displayName;
114: }
115:
116: 117: 118:
119: public function getSingleAccessLevel($sender) {
120: if ($this->chatBot->vars["SuperAdmin"] == $sender){
121: return "superadmin";
122: }
123: if (isset($this->adminManager->admins[$sender])) {
124: $level = $this->adminManager->admins[$sender]["level"];
125: if ($level >= 4) {
126: return "admin";
127: }
128: if ($level >= 3) {
129: return "mod";
130: }
131: }
132: if ($this->chatLeaderController !== null && $this->chatLeaderController->getLeader() == $sender) {
133: return "rl";
134: }
135: if (isset($this->chatBot->guildmembers[$sender])) {
136: return "guild";
137: }
138:
139: $sql = "SELECT name FROM members_<myname> WHERE `name` = ?";
140: $row = $this->db->queryRow($sql, $sender);
141: if ($row !== null) {
142: return "member";
143: }
144: return "all";
145: }
146:
147: 148: 149:
150: public function getAccessLevelForCharacter($sender) {
151: $sender = ucfirst(strtolower($sender));
152:
153: $accessLevel = $this->getSingleAccessLevel($sender);
154:
155: $altInfo = $this->altsController->getAltInfo($sender);
156: if ($sender != $altInfo->main && $altInfo->isValidated($sender)) {
157: $mainAccessLevel = $this->getSingleAccessLevel($altInfo->main);
158: if ($this->compareAccessLevels($mainAccessLevel, $accessLevel) > 0) {
159: $accessLevel = $mainAccessLevel;
160: }
161: }
162:
163: return $accessLevel;
164: }
165:
166: 167: 168: 169: 170:
171: public function compareAccessLevels($accessLevel1, $accessLevel2) {
172: $accessLevel1 = $this->getAccessLevel($accessLevel1);
173: $accessLevel2 = $this->getAccessLevel($accessLevel2);
174:
175: $accessLevels = $this->getAccessLevels();
176:
177: return $accessLevels[$accessLevel2] - $accessLevels[$accessLevel1];
178: }
179:
180: 181: 182: 183: 184:
185: public function compareCharacterAccessLevels($char1, $char2) {
186: $char1 = ucfirst(strtolower($char1));
187: $char2 = ucfirst(strtolower($char2));
188:
189: $char1AccessLevel = $this->getAccessLevelForCharacter($char1);
190: $char2AccessLevel = $this->getAccessLevelForCharacter($char2);
191:
192: return $this->compareAccessLevels($char1AccessLevel, $char2AccessLevel);
193: }
194:
195: public function getAccessLevel($accessLevel) {
196: $accessLevel = strtolower($accessLevel);
197: switch ($accessLevel) {
198: case "raidleader":
199: $accessLevel = "rl";
200: break;
201: case "moderator":
202: $accessLevel = "mod";
203: break;
204: case "administrator":
205: $accessLevel = "admin";
206: break;
207: }
208:
209: $accessLevels = $this->getAccessLevels();
210: if (isset($accessLevels[$accessLevel])) {
211: return strtolower($accessLevel);
212: } else {
213: throw new Exception("Invalid access level '$accessLevel'.");
214: }
215: }
216:
217: public function getAccessLevels() {
218: return self::$ACCESS_LEVELS;
219: }
220: }
221: