MemberArgumentType   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 47
c 2
b 0
f 0
dl 0
loc 96
rs 10
wmc 18

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 2 1
B parse() 0 30 7
B validate() 0 48 10
1
<?php
2
/**
3
 * Livia
4
 * Copyright 2017-2019 Charlotte Dunois, All Rights Reserved
5
 *
6
 * Website: https://charuru.moe
7
 * License: https://github.com/CharlotteDunois/Livia/blob/master/LICENSE
8
*/
9
10
namespace CharlotteDunois\Livia\Types;
11
12
/**
13
 * {@inheritdoc}
14
 * @internal
15
 */
16
class MemberArgumentType extends ArgumentType {
17
    /**
18
     * @internal
19
     */
20
    function __construct(\CharlotteDunois\Livia\Client $client) {
21
        parent::__construct($client, 'member');
22
    }
23
    
24
    /**
25
     * {@inheritdoc}
26
     * @return bool|string|\React\Promise\ExtendedPromiseInterface
27
     */
28
    function validate(string $value, \CharlotteDunois\Livia\Commands\Context $context, ?\CharlotteDunois\Livia\Arguments\Argument $arg = null) {
29
        if($context->message->guild === null) {
30
            return 'Invalid place (not a guild channel) for argument type.';
31
        }
32
        
33
        $prg = \preg_match('/(?:<@!?)?(\d{15,})>?/', $value, $matches);
34
        if($prg === 1) {
35
            return $context->message->guild->fetchMember($matches[1])->then(function () {
36
                return true;
37
            }, function () {
38
                return false;
39
            });
40
        }
41
        
42
        $search = \mb_strtolower($value);
43
        
44
        $inexactMembers = $context->message->guild->members->filter(function ($member) use ($search) {
45
            return (\mb_stripos($member->user->tag, $search) !== false || \mb_stripos($member->displayName, $search) !== false);
46
        });
47
        $inexactLength = $inexactMembers->count();
48
        
49
        if($inexactLength === 0) {
50
             return false;
51
        }
52
        if($inexactLength === 1) {
53
            return true;
54
        }
55
        
56
        $exactMembers = $context->message->guild->members->filter(function ($member) use ($search) {
57
            return (\mb_strtolower($member->user->tag) === $search || \mb_strtolower($member->displayName) === $search);
58
        });
59
        $exactLength = $exactMembers->count();
60
        
61
        if($exactLength === 1) {
62
            return true;
63
        }
64
        
65
        if($exactLength > 0) {
66
            $members = $exactMembers;
67
        } else {
68
            $members = $inexactMembers;
69
        }
70
        
71
        if($members->count() >= 15) {
72
            return 'Multiple members found. Please be more specific.';
73
        }
74
        
75
        return \CharlotteDunois\Livia\Utils\DataHelpers::disambiguation($members, 'members', null).\PHP_EOL;
76
    }
77
    
78
    /**
79
     * {@inheritdoc}
80
     * @return mixed|null|\React\Promise\ExtendedPromiseInterface
81
     */
82
    function parse(string $value, \CharlotteDunois\Livia\Commands\Context $context, ?\CharlotteDunois\Livia\Arguments\Argument $arg = null) {
83
        $prg = \preg_match('/(?:<@!?)?(\d{15,})>?/', $value, $matches);
84
        if($prg === 1) {
85
            return $context->message->guild->members->get($matches[1]);
86
        }
87
        
88
        $search = \mb_strtolower($value);
89
        
90
        $inexactMembers = $context->message->guild->members->filter(function ($member) use ($search) {
91
            return (\mb_stripos($member->user->tag, $search) !== false || \mb_stripos($member->displayName, $search) !== false);
92
        });
93
        $inexactLength = $inexactMembers->count();
94
        
95
        if($inexactLength === 0) {
96
             return null;
97
        }
98
        if($inexactLength === 1) {
99
            return $inexactMembers->first();
100
        }
101
        
102
        $exactMembers = $context->message->guild->members->filter(function ($member) use ($search) {
103
            return (\mb_strtolower($member->user->tag) === $search || \mb_strtolower($member->displayName) === $search);
104
        });
105
        $exactLength = $exactMembers->count();
106
        
107
        if($exactLength === 1) {
108
            return $exactMembers->first();
109
        }
110
        
111
        return null;
112
    }
113
}
114