· 8 years ago · Aug 16, 2018, 03:04 PM
1<?php
2/**
3 * You don't need to know what this does.
4 *
5 * @package ClusterPlus
6 * @author Animesh Sahu <animeshsahu19@yahoo.com>
7 */
8
9namespace ClusterPlus\custom;
10
11/**
12 * Create custom mysql using asyncronous approach
13 *
14 */
15class MySQLExtender extends \CharlotteDunois\Livia\Providers\MySQLProvider
16{
17 protected $formdata;
18
19 function __construct(\React\MySQL\ConnectionInterface $db)
20 {
21 $this->formdata = new \CharlotteDunois\Yasmin\Utils\Collection();
22 parent::__construct($db);
23 }
24
25 function init(\CharlotteDunois\Livia\LiviaClient $client) {
26 $this->runQuery('CREATE TABLE IF NOT EXISTS `formdata` (`guild` VARCHAR(20) NOT NULL, `values` TEXT NOT NULL, PRIMARY KEY (`guild`));')->then(function () {
27 return $this->runQuery('SELECT * FROM `formdata`')->then(function ($result) {
28 foreach($result->resultRows as $row) {
29 $this->loadFormDataRow($row);
30 }
31 return null;
32 });
33 });
34 return parent::init($client);
35 }
36
37 function formdataCreate($guild, &$formdata = array()) {
38 $guild = $this->getGuildID($guild);
39
40 return (new \React\Promise\Promise(function (callable $resolve, callable $reject) use ($guild, &$formdata) {
41 $this->runQuery('SELECT * FROM `formdata` WHERE `guild` = ?', array($guild))->then(function ($command) use ($guild, &$formdata, $resolve, $reject) {
42 if(empty($command->resultRows)) {
43 $this->formdata->set($guild, $formdata);
44 $this->runQuery('INSERT INTO `formdata` (`guild`, `value`) VALUES (?, ?)', array($guild, \json_encode($formdata)))->done($resolve, $reject);
45 } else {
46 $this->loadFormDataRow($command->resultRows[0]);
47 $resolve();
48 }
49 });
50 }));
51 }
52
53 function setupFormdataGuild($guild) {
54 $guild = $this->getGuildID($guild);
55
56 $formdata = $this->formdata->get($guild);
57 if(!$formdata) {
58 $this->formdataCreate($guild)->done(null, array($this->client, 'handlePromiseRejection'));
59 return;
60 }
61 }
62
63 protected function loadFormDataRow(array $row)
64 {
65 $values = \json_decode($row['value'], true);
66 if($values === null) {
67 $this->client->emit('warn', 'MySQLProvider couldn\'t parse the values stored for guild(in form data) "'.$row['guild'].'". Error: '.\json_last_error_msg());
68 return;
69 }
70
71 $values = new \ArrayObject($values, \ArrayObject::ARRAY_AS_PROPS);
72 $this->formdata->set($row['guild'], $values);
73
74 try {
75 $this->setupFormdataGuild($row['guild']);
76 } catch (\InvalidArgumentException $e) {
77 $this->formdata->delete($row['guild']);
78 $this->runQuery('DELETE FROM `formdata` WHERE `guild` = ?', array($row['guild']))->done(null, array($this->client, 'handlePromiseRejection'));
79 }
80 }
81
82 function getFormData($guild, string $key, $defaultValue = null) {
83 $guild = $this->getGuildID($guild);
84
85 if($this->formdata->get($guild) === null) {
86 $this->client->emit('warn', 'Formdata of specified guild is not loaded - loading row - returning default value');
87
88 $this->formdataCreate($guild);
89 return $defaultValue;
90 }
91
92 $formdata = $this->formdata->get($guild);
93 if(\array_key_exists($key, $formdata)) {
94 return $formdata[$key];
95 }
96
97 return $defaultValue;
98 }
99
100 function setFormData($guild, string $key, $value) {
101 $guild = $this->getGuildID($guild);
102
103 if($this->formdata->get($guild) === null) {
104 return $this->formdataCreate($guild)->then(function () use ($guild, $key, $value) {
105 $formdata = $this->formdata->get($guild);
106 $formdata[$key] = $value;
107
108 return $this->runQuery('UPDATE `formdata` SET `value` = ? WHERE `guild` = ?', array(\json_encode($formdata), $guild));
109 });
110 }
111
112 return (new \React\Promise\Promise(function (callable $resolve, callable $reject) use ($guild, $key, $value) {
113 $formdata = $this->formdata->get($guild);
114 $formdata[$key] = $value;
115
116 $this->runQuery('UPDATE `formdata` SET `value` = ? WHERE `guild` = ?', array(\json_encode($formdata), $guild))->done($resolve, $reject);
117 }));
118 }
119}