Created
May 2, 2020 23:52
-
-
Save PJZ9n/085d3572fc3c9136abd06005e39f057a to your computer and use it in GitHub Desktop.
PocketMineでAsyncTaskを使う例(動作未確認)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
//パターン1: 非同期で処理だけする | |
class Task1 extends \pocketmine\scheduler\AsyncTask | |
{ | |
/** @var string POST先URL */ | |
private const URL = "https://example.com/api"; | |
/** @var array */ | |
private $data; | |
public function __construct(array $data) | |
{ | |
$this->data = $data; | |
} | |
public function onRun(): void | |
{ | |
$data = (array)$this->data;//配列はそのまま使えないので明示的にarrayにキャストする | |
\pocketmine\utils\Internet::postURL(self::URL, $data);//例えばWebHookなど適当に送信するだけ | |
} | |
} | |
//処理が終わったらプレイヤーにチャットをさせる | |
class Task2 extends \pocketmine\scheduler\AsyncTask | |
{ | |
/** @var string */ | |
private $message; | |
public function __construct(\pocketmine\Player $player, string $message) | |
{ | |
$this->message = $message; | |
$this->storeLocal($player);//ローカルに保存しておく(onRun内では使えないことに注意) | |
} | |
public function onRun(): void | |
{ | |
//$this->messageを元に翻訳APIを呼んだり.. | |
$result = "かきくけこ";//取得したデータ | |
$this->setResult($result);//結果として設定する | |
} | |
public function onCompletion(\pocketmine\Server $server): void | |
{ | |
/** @var \pocketmine\Player $player */ | |
$player = $this->fetchLocal();//ローカルに保存しておいたPlayerを取得 | |
if (!$player->isOnline()) { | |
return;//すでにオフラインだった場合は終了 | |
} | |
/** @var string $message */ | |
$message = $this->getResult();//設定した結果を取得する | |
$player->chat($message);//取得結果をもとにチャットさせる | |
} | |
} | |
//処理が終わったらクロージャを呼ぶ | |
class Task3 extends \pocketmine\scheduler\AsyncTask | |
{ | |
public function __construct(Closure $closure) | |
{ | |
$this->storeLocal($closure); | |
} | |
public function onRun(): void | |
{ | |
//時間が掛かる処理 | |
$this->setResult("処理の結果"); | |
} | |
public function onCompletion(\pocketmine\Server $server): void | |
{ | |
/** @var Closure $closure */ | |
$closure = $this->getResult(); | |
$closure($this->getResult());//結果を引数にしてクロージャを呼ぶ | |
} | |
} | |
//AsyncPoolは、Server->getAsyncPool()で取得する | |
/** @var \pocketmine\scheduler\AsyncPool $asyncPool */ | |
//Task1 | |
$asyncPool->submitTask(new Task1([ | |
"serverstatus" => "online", | |
])); | |
//Task2 | |
/** @var \pocketmine\Player $player */ | |
$asyncPool->submitTask(new Task2( | |
$player, | |
"あいうえお" | |
)); | |
//Task3 | |
//例えば、処理が終わったらプレイヤーにメッセージを送信する | |
/** @var \pocketmine\Player $player */ | |
$asyncPool->submitTask(new Task3(function ($result) use ($player): void { | |
if (!$player->isOnline()) { | |
//オンラインでは無かったら終了 | |
return; | |
} | |
$player->sendMessage($result);//結果を送信 | |
})); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment