1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- <?php
- declare(strict_types=1);
- /*
- * This file is a part of the DiscordPHP project.
- *
- * Copyright (c) 2015-present David Cole <david.cole1340@gmail.com>
- *
- * This file is subject to the MIT license that is bundled
- * with this source code in the LICENSE.md file.
- */
- const TIMEOUT = 10;
- function wait(callable $callback, float $timeout = TIMEOUT, callable $timeoutFn = null)
- {
- $discord = DiscordSingleton::get();
- $result = null;
- $finally = null;
- $timedOut = false;
- $discord->getLoop()->futureTick(function () use ($callback, $discord, &$result, &$finally) {
- $resolve = function ($x = null) use ($discord, &$result) {
- $result = $x;
- $discord->getLoop()->stop();
- };
- try {
- $finally = $callback($discord, $resolve);
- } catch (\Throwable $e) {
- $resolve($e);
- }
- });
- $timeout = $discord->getLoop()->addTimer($timeout, function () use ($discord, &$timedOut) {
- $timedOut = true;
- $discord->getLoop()->stop();
- });
- $discord->getLoop()->run();
- $discord->getLoop()->cancelTimer($timeout);
- if ($result instanceof Exception) {
- throw $result;
- }
- if (is_callable($finally)) {
- $finally();
- }
- if ($timedOut) {
- if ($timeoutFn != null) {
- $timeoutFn();
- } else {
- throw new \Exception('Timed out');
- }
- }
- return $result;
- }
|