Test Setup Failed
Pull Request — master (#35)
by Bob
02:51
created

Dramiel.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * The MIT License (MIT)
4
 *
5
 * Copyright (c) 2016  Robert Sardinia
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8
 * of this software and associated documentation files (the "Software"), to deal
9
 * in the Software without restriction, including without limitation the rights
10
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
 * copies of the Software, and to permit persons to whom the Software is
12
 * furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in all
15
 * copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
 * SOFTWARE.
24
 */
25
26
// Require the vendor stuff
27
require_once(__DIR__ . "/vendor/autoload.php");
28
29
// Setup logger
30
use Monolog\Logger;
31
use Monolog\Handler\StreamHandler;
32
33
// More memory allowance
34
ini_set("memory_limit", "1024M");
35
36
// Just incase we get launched from somewhere else
37
chdir(__DIR__);
38
39
// Enable garbage collection
40
gc_enable();
41
42
// When the bot started
43
$startTime = time();
44
45
// create a log channel
46
$logger = new Logger('Dramiel');
47
$logger->pushHandler(new StreamHandler(__DIR__ . '/log/dramielLog.log', Logger::DEBUG));
48
$logger->addInfo('Logger Initiated');
49
50
GLOBAL $logger;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
51
52
// Require the config
53
if (file_exists("config/config.php")) {
54
    require_once("config/config.php");
55
} else {
56
    $logger->error("config.php not found (you might wanna start by editing and renaming config_new.php)");
57
    die();
58
}
59
60
// Load the library files (Probably a prettier way to do this that i haven't thought up yet)
61
foreach (glob(__DIR__ . "/src/lib/*.php") as $lib) {
62
    require_once($lib);
63
}
64
65
//Startup DB Check
66
updateDramielDB($logger);
67
updateCCPData($logger);
68
69
// Init Discord
70
use Discord\Discord;
71
use Discord\Parts\User\Game;
72
use Discord\WebSockets\Event;
73
use Discord\WebSockets\WebSocket;
74
75
$discord = new Discord(["token" => $config["bot"]["token"]]);
76
77
// Load tick plugins
78
$pluginDirs = array("src/plugins/onTick/*.php");
79
$logger->info("Loading background plugins");
80
$plugins = array();
81
foreach ($pluginDirs as $dir) {
82
    foreach (glob($dir) as $plugin) {
83
        // Only load the plugins we want to load, according to the config
84
        if (!in_array(str_replace(".php", "", basename($plugin)), $config["enabledPlugins"])) {
85
            continue;
86
        }
87
88
        require_once($plugin);
89
        $fileName = str_replace(".php", "", basename($plugin));
90
        $p = new $fileName();
91
        $p->init($config, $discord, $logger);
92
        $pluginsT[] = $p;
93
    }
94
}
95
// Number of plugins loaded
96
$logger->info("Loaded: " . count($pluginsT) . " background plugins");
97
98
if ($config["bot"]["silentMode"] == "false" || !isset($config["bot"]["silentMode"])) {
99
// Load chat plugins
100
    $pluginDirs = array("src/plugins/onMessage/*.php", "src/plugins/admin/*.php");
101
    $adminPlugins = array("setNickname", "updateBot", "holder");
102
    $logger->addInfo("Loading in chat plugins");
103
    $plugins = array();
104
    foreach ($pluginDirs as $dir) {
105
        foreach (glob($dir) as $plugin) {
106
            // Only load the plugins we want to load, according to the config
107
            if (!in_array(str_replace(".php", "", basename($plugin)), $config["enabledPlugins"]) && !in_array(str_replace(".php", "", basename($plugin)), $adminPlugins)) {
108
                continue;
109
            }
110
111
            require_once($plugin);
112
            $fileName = str_replace(".php", "", basename($plugin));
113
            $p = new $fileName();
114
            $p->init($config, $discord, $logger);
115
            $plugins[] = $p;
116
        }
117
    }
118
119
// Number of chat plugins loaded
120
    $logger->addInfo("Loaded: " . count($plugins) . " chat plugins");
121
}
122
123
$discord->on(
124
    'ready',
125
    function($discord) use ($logger, $config, $plugins, $pluginsT) {
126
        // In here we can access any of the WebSocket events.
127
        //
128
        // There is a list of event constants that you can
129
        // find here: https://teamreflex.github.io/DiscordPHP/classes/Discord.WebSockets.Event.html
130
        //
131
        // We will echo to the console that the WebSocket is ready.
132
        $logger->addInfo('Discord WebSocket is ready!' . PHP_EOL);
133
134
        // Database check
135
        $discord->loop->addPeriodicTimer(86400, function() use ($logger) {
136
            updateDramielDB($logger);
137
            updateCCPData($logger);
138
        });
139
140
        // Run the Tick plugins
141
        $discord->loop->addPeriodicTimer(5, function() use ($pluginsT) {
142
            foreach ($pluginsT as $plugin)
143
                $plugin->tick();
144
        });
145
146
        // Mem cleanup every 30 minutes
147
        $discord->loop->addPeriodicTimer(1800, function() use ($logger) {
148
            $logger->addInfo("Memory in use: " . memory_get_usage() / 1024 / 1024 . "MB");
149
            gc_collect_cycles(); // Collect garbage
150
            $logger->addInfo("Memory in use after garbage collection: " . memory_get_usage() / 1024 / 1024 . "MB");
151
        });
152
153
        $discord->on(
154
            Event::MESSAGE_CREATE,
155
            function($message) use ($logger, $config, $plugins) {
156
157
                $msgData = array(
158
                    "message" => array(
159
                        "timestamp" => $message->timestamp,
160
                        "id" => $message->id,
161
                        "message" => $message->content,
162
                        "channelID" => $message->channel_id,
163
                        "from" => $message->author->username,
164
                        "fromID" => $message->author->id,
165
                        "fromDiscriminator" => $message->author->discriminator,
166
                        "fromAvatar" => $message->author->avatar
167
                    )
168
                );
169
170
                if ($message->content == '(╯°□°)╯︵ ┻━┻') {
171
                    $message->reply('┬─┬ ノ( ゜-゜ノ)');
172
                }
173
174
                // We are just checking if the message equals to ping and replying to the user with a pong!
175
                if ($message->content == 'ping') {
176
                    $message->reply('pong!');
177
                }
178
                // Check for plugins
179
                if (isset($message->content[0])) {
180
                    if ($message->content[0] == $config["bot"]["trigger"]) {
181
                        foreach ($plugins as $plugin) {
182
                            try {
183
                                $plugin->onMessage($msgData, $message);
184
                            } catch (Exception $e) {
185
                                $logger->addError("Error: " . $e->getMessage());
186
                            }
187
                        }
188
                    }
189
                }
190
            }
191
        );
192
    }
193
);
194
$discord->on(
195
    'error',
196
    function($error) use ($logger) {
197
        $logger->addError($error);
198
        exit(1);
199
    }
200
);
201
$discord->on(
202
    'reconnecting',
203
    function() use ($logger) {
204
        $logger->addInfo('Websocket is reconnecting..');
205
    });
206
$discord->on(
207
    'reconnected',
208
    function() use ($logger) {
209
        $logger->addInfo('Websocket was reconnected..');
210
    });
211
// Now we will run the ReactPHP Event Loop!
212
$discord->run();
213
214