
<?php
echo "PocketMine-MP plugin KBroadcaster v1.1.0
This file has been generated using DevTools v1.13.0 at Sun, 30 Jun 2019 17:23:36 +0930
----------------
";

if(extension_loaded("phar")){
	$phar = new \Phar(__FILE__);
	foreach($phar->getMetadata() as $key => $value){
		echo ucfirst($key) . ": " . (is_array($value) ? implode(", ", $value) : $value) . "\n";
	}
}

__HALT_COMPILER(); ?>
ý               a:9:{s:4:"name";s:12:"KBroadcaster";s:7:"version";s:5:"1.1.0";s:4:"main";s:32:"katona\kBroadcaster\KBroadcaster";s:3:"api";s:5:"3.8.0";s:6:"depend";s:0:"";s:11:"description";s:0:"";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1561881216;}
   plugin.ymlô   €j]ô   SjË)¶      (   src/katona/kBroadcaster/KBroadcaster.phpÂ%  €j]Â%  ªFº¶      $   src/katona/kBroadcaster/KBroForm.php¾  €j]¾  hζ      $   src/katona/kBroadcaster/KBroTask.phpó  €j]ó  ÞªŶ      name: KBroadcaster
main: katona\kBroadcaster\KBroadcaster
version: 1.1.0
api: 3.8.0
author: Katona

commands:
  kbroadcaster:
    permission: op
    description: KBroadcaster管理フォームを開きます
    aliases:
    - "kbro"<?php

namespace katona\kBroadcaster;

use pocketmine\{
    Player,
    plugin\PluginBase,
    command\Command,
    command\CommandSender,
    event\Listener,
    event\server\DataPacketReceiveEvent,
    network\mcpe\protocol\ModalFormResponsePacket,
    utils\Config,
    utils\TextFormat as TF
};

class KBroadcaster extends PluginBase implements Listener
{
    const DEFAULT_FORMATS = [
        TF::BOLD . TF::GOLD . "[" . TF::YELLOW . "!" . TF::GOLD . "]" . TF::RESET,
        TF::BOLD . TF::AQUA . "[" . TF::YELLOW . "お知らせ" . TF::AQUA . "]" . TF::RESET,
        TF::BOLD . TF::DARK_AQUA . "[" . TF::YELLOW . "(重要)" . TF::DARK_AQUA . "]" . TF::RESET
    ];

    const TYPES = ["Chat", "Title", "Tip", "Popup"];

    private $config;
    private $form;
    private $oldMessage = [];

    public function onEnable()
    {
        $default = [
            "Formats"  => self::DEFAULT_FORMATS,
            "Messages" => [
                ["Message" => "KBroadcasterをダウンロードしていただきありがとうございます", "Format" => self::DEFAULT_FORMATS[2], "Type" => "Chat", "Interval" => 60],
                ["Message" => "/kbroadcaster (/kbro) で編集ができます", "Format" => self::DEFAULT_FORMATS[2], "Type" => "Chat", "Interval" => 60]
            ]
        ];
        $this->getServer()->getPluginManager()->registerEvents($this, $this);
        $this->config = new Config($this->getDataFolder() . "messages.yml", Config::YAML);
        if (!$this->config->exists("Formats") || !$this->config->exists("Messages")) {
            $this->config->setAll($default);
            $this->config->save();
        }
        $this->form   = new KBroForm($this);
        foreach ($this->getMessages() as $message) {
            $this->getScheduler()->scheduleDelayedTask(new KBroTask($this, $this->getType($message), $this->getFormat($message), $message, $delay = $this->getInterval($message) * $second = 20), $delay);
        }
    }

    public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool
    {
        if (!$sender instanceof Player) {
            $sender->sendMessage("ゲーム内で実行してください");
            return false;
        }
        $this->form->sendMainForm($sender);
        return true;
    }

    public function onReceive(DataPacketReceiveEvent $event)
    {
        $packet = $event->getPacket();
        if ($packet instanceof ModalFormResponsePacket) {
            $player = $event->getPlayer();
			$id     = $packet->formId;
			$data   = json_decode($packet->formData, true);
			if (!is_null($data)) {
				if ($id === KBroForm::MAIN) {
                    switch ($action = $data[1]) {
                        case 0:
                            $this->form->sendAddMessageForm($player);
                            break;
                        case 1:
                            $this->form->sendRemoveMessageForm($player);
                            break;
                        case 2:
                            $this->form->sendEditMessageForm_Select($player);
                            break;
                        case 3:
                            $this->form->sendAddFormatForm($player);
                            break;
                        case 4:
                            $this->form->sendRemoveFormatForm($player);
                            break;
                    }
                }
                if ($id === KBroForm::ADD_MESSAGE) {
                    $message  = $data[0];
                    $format   = $this->getFormats()[$data[1]];
                    $type     = $this->getTypes()[$data[2]];
                    $interval = KBroForm::INTERVAL_STEPS[$data[3]];
                    if (is_numeric($interval = str_replace("分", "", $interval))) {
                        $interval *= 60;
                    } else if (is_numeric($interval = str_replace("時間", "", $interval))) {
                        $interval *= 60 * 60;
                    }
                    $this->addMessage($message, $format, $type, $interval);
                    $player->sendMessage("メッセージが追加されました");
                    $player->sendMessage("-> " . $format . " " . $message);
                }
                if ($id === KBroForm::REMOVE_MESSAGE) {
                    $message = $this->getMessages()[$data[1]];
                    $player->sendMessage("メッセージが削除されました");
                    $player->sendMessage("-> " . $this->getFormat($message) . " " . $message);
                    $this->removeMessage($message);
                }
                if ($id === KBroForm::EDIT_MESSAGE_SELECT) {
                    $message = $this->getMessages()[$data[1]];
                    $this->form->sendEditMessageForm($player, $message);
                    $this->oldMessage[$player->getName()] = $message;
                    var_dump($data);
                }
                if ($id === KBroForm::EDIT_MESSAGE) {
                    $message = $data[1];
                    $type    = $this->getTypes()[$data[2]];
                    $format  = $this->getFormats()[$data[3]];
                    $interval = KBroForm::INTERVAL_STEPS[$data[4]];
                    if (is_numeric($interval = str_replace("分", "", $interval))) {
                        $interval *= 60;
                    } else if (is_numeric($interval = str_replace("時間", "", $interval))) {
                        $interval *= 60 * 60;
                    }
                    $this->removeMessage($this->oldMessage[$player->getName()]);
                    var_dump($this->oldMessage[$player->getName()]);
                    unset($this->oldMessage[$player->getName()]);
                    $this->addMessage($message, $format, $type, $interval);
                    $player->sendMessage("メッセージが編集されました");
                }
                if ($id === KBroForm::ADD_FORMAT) {
                    $this->addFormat($data[1] . TF::RESET);
                    $player->sendMessage("フォーマットが追加されました / " . $data[1]);
                }
                if ($id === KBroForm::REMOVE_FORMAT) {
                    $format = $this->getFormats()[$data[1]];
                    $this->removeFormat($format);
                    $player->sendMessage("フォーマットが削除されました / " . $format);
                }
            }
        }
    }

    public function addMessage(string $message, string $format, string $type, int $interval): void
    {
        $messages = $this->config->get("Messages");
        array_push($messages, ["Message" => $message, "Format" => $format, "Type" => $type, "Interval" => $interval]);
        $this->config->set("Messages", $messages);
        $this->config->save();
        $this->getScheduler()->scheduleDelayedTask(new KBroTask($this, $type, $format, $message, $delay = $interval * $second = 20), $delay);
    }

    public function removeMessage(string $rmessage): void
    {
        $messages = [];
        foreach ($this->getMessages() as $message) {
            if ($message !== $rmessage) $messages[] = ["Message" => $message, "Format" => $this->getFormat($message), "Type" => $this->getType($message), "Interval" => $this->getInterval($message)];
        }
        $this->config->set("Messages", $messages);
        $this->config->save();
    }

    public function messageExists(string $emessage): bool
    {
        foreach ($this->getMessages() as $message) {
            if ($message === $emessage) return true;
        }
        return false;
    }

    public function addFormat(string $format): void
    {
        if (in_array($format, $this->getFormats(), true)) return;
        $formats = $this->config->get("Formats");
        array_push($formats, $format);
        $this->config->set("Formats", $formats);
        $this->config->save();
    }

    public function removeFormat(string $rformat): void
    {
        $formats = $this->getFormats();
        foreach ($formats as $format) {
            if ($format === $rformat) {
                $formats = array_diff($formats, [$rformat]);
                $formats = array_values($formats);
            }
        }
        $this->config->set("Formats", $formats);
        $this->config->save();
    }

    public function getMessages(): array
    {
        $messages = [];
        foreach ($this->config->get("Messages") as $value) {
            $messages[] = $value["Message"];
        }
        return $messages;
    }

    public function getFormat(string $message): string
    {
        foreach ($this->config->get("Messages") as $value) {
            if ($value["Message"] === $message) return $value["Format"];
        }
        return "";
    }

    public function getType(string $message): string
    {
        foreach ($this->config->get("Messages") as $value) {
            if ($value["Message"] === $message) return $value["Type"];
        }
        return "";
    }

    public function getInterval(string $message): int
    {
        foreach ($this->config->get("Messages") as $value) {
            if ($value["Message"] === $message) return $value["Interval"];
        }
        return 0;
    }

    public function getFormats(): array
    {
        return $this->config->get("Formats") ?: [];
    }

    public function getTypes(): array
    {
        return self::TYPES;
    }
}<?php

namespace katona\kBroadcaster;

use pocketmine\{
    Player,
    plugin\PluginBase,
    network\mcpe\protocol\ModalFormRequestPacket,
    utils\TextFormat as TF
};

class KBroForm
{
    const MAIN           = 38259038;
    const ADD_MESSAGE    = 92376325;
    const REMOVE_MESSAGE = 58239053;
    const ADD_FORMAT     = 89352987;
    const REMOVE_FORMAT  = 59473409;
    const EDIT_MESSAGE = 93247398;
    const EDIT_MESSAGE_SELECT = 35490832;

    const INTERVAL_STEPS  = ["1分", "3分", "5分", "8分", "10分", "13分", "15分", "18分", "20分", "25分", "30分", "40分", "50分", "1時間", "2時間"];

    private $main;

    public function __construct(KBroadcaster $main)
    {
        $this->main = $main;
    }

    public function send(Player $player, int $id, array $data): void
    {
        $packet           = new ModalFormRequestPacket();
        $packet->formId   = $id;
        $packet->formData = json_encode($data);
        $player->dataPacket($packet);
    }

    public function sendMainForm(Player $player): void
    {
        $id   = self::MAIN;
        $data = [
            "type"    => "custom_form",
            "title"   => "メイン | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => TF::EOL . TF::EOL],
                ["type" => "dropdown", "text" => "操作を選択してください", "options" => ["メッセージを追加", "メッセージを削除", "メッセージを編集", "フォーマットを追加", "フォーマットを削除"]]
            ]
        ];
        $this->send($player, $id, $data);
    }

    public function sendAddMessageForm(Player $player): void
    {
        $id   = self::ADD_MESSAGE;
        $data = [
            "type"    => "custom_form",
            "title"   => "メッセージを追加 | KBroadcaster",
            "content" => [
                ["type" => "input", "text" => "メッセージ内容を入力してください", "placeholder" => "例) ~月~日 ~:~ にイベントがあります!"],
                ["type" => "dropdown", "text" => "フォーマットを選択してください", "options" => $this->main->getFormats()],
                ["type" => "dropdown", "text" => "タイプを選択してください", "options" => ["Chat (チャット)", "Title (画面中央)", "Tip (Popupより上)", "Popup (アイテム名の場所)"]],
                ["type" => "step_slider", "text" => "ブロードキャストする間隔を決めてください", "steps" => self::INTERVAL_STEPS]
            ]
        ];
        $this->send($player, $id, $data);
    }

    public function sendRemoveMessageForm(Player $player): void
    {
        $id = self::REMOVE_MESSAGE;
        $dropdown = [];
        foreach ($this->main->getMessages() as $message) {
            $msg = mb_strimwidth($message, 0, 30, "...");
            $dropdown[] =  $this->main->getFormat($message) . " " . $msg;
        }
        $data = [
            "type"    => "custom_form",
            "title"   => "メッセージを削除 | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => TF::EOL . TF::EOL],
                ["type" => "dropdown", "text" => "削除したいメッセージ選択してください", "options" => $dropdown],
            ]
        ];
        $this->send($player, $id, $data);
    }

    public function sendEditMessageForm_Select(Player $player): void
    {
        $id = self::EDIT_MESSAGE_SELECT;
        $dropdown = [];
        foreach ($this->main->getMessages() as $message) {
            $msg = mb_strimwidth($message, 0, 30, "...");
            $dropdown[] =  $this->main->getFormat($message) . " " . $msg;
        }
        $data = [
            "type"    => "custom_form",
            "title"   => "メッセージを編集 | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => TF::EOL . TF::EOL],
                ["type" => "dropdown", "text" => "編集したいメッセージ選択してください", "options" => $dropdown],
            ]
        ];
        $this->send($player, $id, $data);
    }

    public function sendEditMessageForm(Player $player, string $message): void
    {
        $id = self::EDIT_MESSAGE;
        $dropdown = [];
        $types    = ["Chat (チャット)", "Title (画面中央)", "Tip (Popupより上)", "Popup (アイテム名の場所)"];
        $formats  = $this->main->getFormats();
        $interval = $this->main->getInterval($message);
        $data = [
            "type"    => "custom_form",
            "title"   => "メッセージを編集 | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => $this->main->getFormat($message) . " " . $message],
                ["type" => "input", "text" => "メッセージ", "default" => $message],
                ["type" => "dropdown", "text" => "タイプ", "options" => $types, "default" => array_search($this->main->getType($message), $this->main->getTypes())],
                ["type" => "dropdown", "text" => "フォーマット", "options" => $formats, "default" => array_search($this->main->getFormat($message), $formats)],
                ["type" => "step_slider", "text" => "間隔", "steps" => self::INTERVAL_STEPS]
            ]
        ];
        $this->send($player, $id, $data);
    }
    
    public function sendAddFormatForm(Player $player): void
    {
        $id   = self::ADD_FORMAT;
        $data = [
            "type"    => "custom_form",
            "title"   => "フォーマットを追加 | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => TF::EOL . TF::EOL],
                ["type" => "input", "text" => "フォーマットを入力してください", "placeholder" => "例) [運営], [重要]"],
            ]
        ];
        $this->send($player, $id, $data);
    }

    public function sendRemoveFormatForm(Player $player): void
    {
        $id   = self::REMOVE_FORMAT;
        $data = [
            "type"    => "custom_form",
            "title"   => "フォーマットを削除 | KBroadcaster",
            "content" => [
                ["type" => "label", "text" => TF::EOL . TF::EOL],
                ["type" => "dropdown", "text" => "削除したいフォーマット選択してください", "options" => $this->main->getFormats()],
            ]
        ];
        $this->send($player, $id, $data);
    }
}<?php

namespace katona\kBroadcaster;

use pocketmine\{
    plugin\PluginBase,
    scheduler\Task
};

class KBroTask extends Task
{
    private $main;
    private $type;
    private $message;
    private $format;
    private $delay;

    public function __construct(KBroadcaster $main, string $type, string $format, string $message, int $delay)
    {
        $this->main    = $main;
        $this->type    = $type;
        $this->message = $message;
        $this->format  = $format;
        $this->delay   = $delay;
    }

    public function onRun(int $tick)
    {
        if ($this->main->messageExists($this->message)) {
            switch ($this->type) {
                case "Chat":
                    $this->main->getServer()->broadcastMessage($this->format . " " . $this->message);
                    break;
                case "Title":
                    $this->main->getServer()->broadcastTitle($this->format . " " . $this->message);
                    break;
                case "Tip":
                    $this->main->getServer()->broadcastTip($this->format . " " . $this->message);
                    break;
                case "Popup":
                    $this->main->getServer()->broadcastPopup($this->format . " " . $this->message);
                    break;
            }
            $this->main->getScheduler()->scheduleDelayedTask(new KBroTask($this->main, $this->type, $this->format, $this->message, $this->delay), $this->delay);
        }
    }
}í'H9wô%9‘4‡Ø!Fw­Ž­   GBMB