Ejemplo n.º 1
0
    public function onRun(array $args, Faction $faction, Player $player)
    {
        if (!isset($args[0])) {
            return self::WRONG_USE;
        }
        $ranks = $faction->getRanks();
        switch (strtolower(array_shift($args))) {
            case "help":
                return str_replace("\r", "", <<<EOH
Usage of /f perm|rank|p|r:
/f perm <app|apoint|assign|promote|demote> <player> <rank> Appoint/promote/demote/assign a player to another rank
/f perm <add|new> <rank name> <permission>,[permission],... [description ...] Add a new rank
/f perm <mod|modify> <rank name> <+/-><permission> [+/-][permission] Modify a rank's permissions
/f perm <desc|description> <rank name> [description ...] Change/view a rank's description
/f perm <rm|remove> <rank name> [rank to reassign members of the removed rank to = default rank] Remove a rank
/f perm rename <old rank name> <new rank name> Rename a rank
/f perm set <rank> <d|default|t|truce|a|ally|s|std|standard|e|enemy|f|foe>
/f perm list [ranks|perms = ranks] List all ranks in your faction or all permission nodes available.
/f perm claim Claim all permissions you can have in your faction if you are the faction founder.
EOH
);
            case "add":
            case "new":
                if (!isset($args[2])) {
                    return self::WRONG_USE;
                }
                $name = array_shift($args);
                $permissions = array_shift($args);
                $perms = 0;
                $unknowns = [];
                foreach (preg_split('#,;/\\+#', $permissions, -1, PREG_SPLIT_NO_EMPTY) as $perm) {
                    $p = self::parsePermission($perm);
                    if ($p === null) {
                        $unknowns[] = $perm;
                    } else {
                        $perms |= $p;
                    }
                }
                $id = max(array_keys($ranks)) + 1;
                $rank = new Rank($id, $name, $perms, implode(" ", $args));
                $ranks[$id] = $rank;
                $faction->setRanks($ranks);
                return "New rank added: {$name}." . (count($unknowns) > 0 ? "\n[PF] WARNING: The following permission flags are not recognized thus ignored:\n  " . implode(", ", $unknowns) : "");
            case "app":
            case "appoint":
            case "assign":
            case "promote":
            case "demote":
                if (!isset($args[1])) {
                    return self::WRONG_USE;
                }
                $members = $faction->getMembers(true);
                if (!isset($members[$name = array_shift($args)])) {
                    return "{$name} isn't in your faction!";
                }
                $orig = $members[$name];
                $newRank = array_shift($args);
                foreach ($ranks as $rk) {
                    if ($rk->getName() === $newRank) {
                        $selected = $rk;
                        break;
                    }
                }
                if (!isset($selected)) {
                    return "Rank {$newRank} not found!";
                }
                $rank = $faction->getMemberRank($player);
                if (!$rank->hasPerm(Rank::P_ALL_PERMS)) {
                    for ($i = 0; $i < 0x40; $i++) {
                        $perm = pow(2, $i);
                        if (!$rank->hasPerm($perm)) {
                            if ($selected->hasPerm($perm) xor $ranks[$orig]->hasPerm($perm)) {
                                // first normal use or XOR ;)
                                return "You don't have permission to promote/demote a member to a rank with permission you don't have!";
                                // thank you freemode ChanServ for this idea :)
                            }
                        }
                    }
                }
                $members[$name] = $selected->getID();
                $faction->setMembers($members);
                return "The rank of {$name} has been set to {$newRank}.";
            case "desc":
            case "description":
                if (!isset($args[0])) {
                    return self::WRONG_USE;
                }
                $name = array_shift($args);
                foreach ($faction->getRanks() as $rank) {
                    if ($rank->getName() === $name) {
                        if (isset($args[0])) {
                            $rank->setDescription(implode(" ", $args));
                            return "Rank description updated.";
                        } else {
                            return "Rank {$name}: " . $rank->getDescription();
                        }
                    }
                }
                return "Rank {$name} not found!";
            case "mod":
            case "modify":
                if (!isset($args[0])) {
                    return self::WRONG_USE;
                }
                $name = array_shift($args);
                foreach ($ranks as $rk) {
                    if ($rk->getName() === $name) {
                        $rank = $rk;
                        break;
                    }
                }
                if (!isset($rank)) {
                    return "Rank {$name} not found!";
                }
                $unknowns = [];
                $cnt = 0;
                $alreadys = [];
                while (isset($args[0]) and ($args[0][0] === "+" or $args[0][0] === "-")) {
                    $arg = array_shift($args);
                    $add = $arg[0] === "+";
                    $arg = substr($arg, 1);
                    $node = self::parsePermission($arg);
                    if (is_int($node)) {
                        if ($rank->hasPerm($node) xor $add) {
                            $rank->setPerm($node, $add);
                            $cnt++;
                        } else {
                            $alreadys[] = $arg;
                        }
                    } else {
                        $unknowns[] = $arg;
                    }
                }
                $out = "{$cnt} permissions of rank {$name} changed.\n";
                if (count($alreadys)) {
                    $out .= TextFormat::YELLOW . "[PF] The following permissions remain the same:\n[PF] " . implode(", ", $alreadys);
                }
                if (count($unknowns)) {
                    $out .= TextFormat::RED . "[PF] The following unknown permissions are ignored:\n[PF] " . implode(", ", $unknowns);
                }
                return $out;
            case "rm":
            case "remove":
                if (!isset($args[0])) {
                    return self::WRONG_USE;
                }
                $name = array_shift($args);
                if (isset($args[0])) {
                    $reassignTo = array_shift($args);
                }
                foreach ($ranks as $rk) {
                    if ($rk->getName() === $name) {
                        $rank = $rk;
                    }
                    if (isset($reassignTo) and !isset($reassign)) {
                        if ($rk->getName() === $reassignTo) {
                            $reassign = $rk;
                        }
                    }
                    if (isset($rank) and (!isset($reassignTo) or isset($reassign))) {
                        break;
                    }
                }
                if (!isset($rank)) {
                    return "Rank {$name} not found!";
                }
                if (isset($reassignTo) and !isset($reassign)) {
                    return "Rank {$reassignTo} not found!";
                }
                if (!isset($reassign)) {
                    $reassign = $faction->getDefaultRank();
                }
                $members = $faction->getMembers(true);
                $cnt = 0;
                foreach ($members as $member => $id) {
                    if ($id === $rank->getID()) {
                        $members[$member] = $reassign->getID();
                        $cnt++;
                    }
                }
                $faction->setMembers($members);
                return "Rank {$name} has been removed. All members ({$cnt}) of the rank {$name} have been reassigned to rank " . $reassign->getName() . ".";
            case "set":
                if (!isset($args[1])) {
                    return self::WRONG_USE;
                }
                $name = array_shift($args);
                $rank = $faction->getRankByName($name);
                if (!$rank instanceof Rank) {
                    return "Rank {$name} not found!";
                }
                $id = $rank->getID();
                switch ($type = strtolower(array_shift($args[0]))) {
                    case "d":
                    case "default":
                        $faction->setDefaultRank($id);
                        return "Default rank set to {$rank}.";
                    case "t":
                    case "truce":
                        return "Truce rank set to {$rank}.";
                    case "a":
                    case "ally":
                        $faction->setAllyRank($id);
                        return "Ally rank set to {$rank}.";
                    case "s":
                    case "std":
                    case "standard":
                    case "e":
                    case "enemy":
                    case "f":
                    case "foe":
                        $faction->setStdRank($id);
                        return "Standard/enemy rank set to {$rank}.";
                    default:
                        return "Unknown rank type {$type}.";
                }
            case "rename":
                if (!isset($args[1])) {
                    return self::WRONG_USE;
                }
                $old = array_shift($args);
                $new = array_shift($args);
                $rank = $faction->getRankByName($old);
                if (!$rank instanceof Rank) {
                    return "Rank {$old} not found!";
                }
                $rank->setName($new);
                return "Rank {$old} has been renamed to {$new}.";
            case "list":
                if (!isset($args[0])) {
                    array_unshift($args, "ranks");
                }
                switch ($list = array_shift($args)) {
                    case "ranks":
                        return "Ranks in your faction: " . implode(", ", array_map(function (Rank $rank) {
                            return $rank->getName();
                        }, $ranks));
                    case "perms":
                        return "Available permission nodes: " . implode(", ", array_map(function ($name) {
                            return substr($name, 2);
                        }, array_keys((new \ReflectionClass("pocketfactions\\faction\\Rank"))->getConstants()))) . "\nSee https://github.com/LegendOfMCPE/PocketFactions/wiki/permissions for more details.";
                    default:
                        return "Unknown list: {$list}";
                }
            case "claim":
                if (strtolower($faction->getFounder()) !== strtolower($player->getName())) {
                    return self::NO_PERM;
                }
                $id = max(array_keys($ranks));
                $description = "Auto-generated founder rank";
                $i = 2;
                $name = "Founder";
                while ($faction->getRankByName($name) instanceof Rank) {
                    $name = "Founder (" . $i++ . ")";
                }
                $rank = new Rank($id, $name, Rank::P_ALL, $description);
                $ranks[$id] = $rank;
                $faction->setRanks($ranks);
                return "Your rights have been claimed.";
            default:
                return self::WRONG_USE;
        }
    }