Completed
Pull Request — master (#7)
by Vojta
01:30
created

Plugin::setSwiftMailerHandler()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 34
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 34
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 19
nc 3
nop 1
1
<?php namespace VojtaSvoboda\ErrorLogger;
2
3
use Backend\Facades\BackendAuth;
4
use Config;
5
use Log;
6
use Monolog\Handler\SwiftMailerHandler;
7
use Swift_Message;
8
use VojtaSvoboda\ErrorLogger\Models\Settings;
9
use Monolog\Formatter\LineFormatter;
10
use Monolog\Handler\NativeMailerHandler;
11
use Monolog\Handler\NewRelicHandler;
12
use Monolog\Handler\SlackHandler;
13
use Monolog\Logger;
14
use System\Classes\PluginBase;
15
16
/**
17
 * Error Logger Plugin Information File
18
 */
19
class Plugin extends PluginBase
20
{
21
    /**
22
     * Returns information about this plugin.
23
     *
24
     * @return array
25
     */
26
    public function pluginDetails()
27
    {
28
        return [
29
            'name' => 'vojtasvoboda.errorlogger::lang.plugin.name',
30
            'description' => 'vojtasvoboda.errorlogger::lang.plugin.description',
31
            'author' => 'Vojta Svoboda',
32
            'icon' => 'icon-bug',
33
        ];
34
    }
35
36
    public function registerSettings()
37
    {
38
        return [
39
            'config' => [
40
                'label' => 'vojtasvoboda.errorlogger::lang.settings.label',
41
                'category' => 'system::lang.system.categories.system',
42
                'icon' => 'icon-bug',
43
                'description' => 'vojtasvoboda.errorlogger::lang.settings.description',
44
                'class' => 'VojtaSvoboda\ErrorLogger\Models\Settings',
45
                'permissions' => ['vojtasvoboda.errorlogger.*'],
46
                'order' => 610,
47
            ]
48
        ];
49
    }
50
51
    public function registerPermissions()
52
    {
53
        return [
54
            'vojtasvoboda.errorlogger.*' => [
55
                'tab' => 'vojtasvoboda.errorlogger::lang.permissions.tab',
56
                'label' => 'vojtasvoboda.errorlogger::lang.permissions.all.label'
57
            ]
58
        ];
59
    }
60
61
    /**
62
     * Boot plugin and register handlers
63
     */
64
    public function boot()
65
    {
66
        /** @var Logger $monolog */
67
        $monolog = Log::getMonolog();
68
69
        $this->setNativeMailerHandler($monolog);
70
        $this->setSwiftMailerHandler($monolog);
71
        $this->setSlackHandler($monolog);
72
        $this->setSyslogHandler($monolog);
73
        $this->setNewrelicHandler($monolog);
74
    }
75
76
    /**
77
     * Set native mailer handler.
78
     * 
79
     * Formatting lines example (use before pushHandler()):
80
     *   $formater = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n");
81
     *   $handler->setFormatter($formater);
82
     *
83
     * @param Logger $monolog
84
     *
85
     * @return Logger
86
     */
87
    private function setNativeMailerHandler($monolog)
88
    {
89
        $required = ['nativemailer_enabled', 'nativemailer_email'];
90
        if (!$this->checkRequiredFields($required)) {
91
            return $monolog;
92
        }
93
94
        // disable when debug is true
95
        $debug = Settings::get('nativemailer_debug');
96
        if ($debug & Config::get('app.debug')) {
97
            return $monolog;
98
        }
99
100
        $email = Settings::get('nativemailer_email');
101
        $subject = Config::get('app.url') . ' - error report';
102
        $from = Config::get('mail.from.address');
103
        $level = Settings::get('nativemailer_level', 100);
104
        $handler = new NativeMailerHandler($email, $subject, $from, $level);
105
        $monolog->pushHandler($handler);
106
107
        return $monolog;
108
    }
109
110
    /**
111
     * Set Swift mailer handler, where SwiftMailer instance is taken from OctoberCMS.
112
     *
113
     * @param Logger $monolog
114
     *
115
     * @return Logger
116
     */
117
    private function setSwiftMailerHandler($monolog)
118
    {
119
        $required = ['swiftmailer_enabled', 'swiftmailer_email'];
120
        if (!$this->checkRequiredFields($required)) {
121
            return $monolog;
122
        }
123
124
        // disable when debug is true
125
        $debug = Settings::get('swiftmailer_debug');
126
        if ($debug & Config::get('app.debug')) {
127
            return $monolog;
128
        }
129
130
        // get the mailer from OctoberCMS
131
        $octoberMailer = $this->app->make('mailer');
132
        $swiftMailer = $octoberMailer->getSwiftMailer();
133
134
        // get message parameters
135
        $email = Settings::get('swiftmailer_email');
136
        $subject = Config::get('app.url') . ' - error report';
137
        $from = Config::get('mail.from.address');
138
        $level = Settings::get('swiftmailer_level', 100);
139
140
        // prepare message
141
        $message = new Swift_Message($subject);
142
        $message->addFrom($from);
143
        $message->addTo($email);
144
145
        // register handler
146
        $handler = new SwiftMailerHandler($swiftMailer, $message, $level);
147
        $monolog->pushHandler($handler);
148
149
        return $monolog;
150
    }
151
152
    /**
153
     * Set handler for Slack messaging app.
154
     *
155
     * @param Logger $monolog
156
     *
157
     * @return Logger
158
     */
159
    private function setSlackHandler($monolog)
160
    {
161
        $required = ['slack_enabled', 'slack_token'];
162
        if (!$this->checkRequiredFields($required)) {
163
            return $monolog;
164
        }
165
166
        $token = Settings::get('slack_token');
167
        $channel = Settings::get('slack_channel', 'random');
168
        $username = Settings::get('slack_username', 'error-bot');
169
        $attachment = Settings::get('slack_attachment', false);
170
        $level = Settings::get('slack_level', 100);
171
        $handler = new SlackHandler($token, $channel, $username, $attachment, null, $level);
172
        $monolog->pushHandler($handler);
173
174
        return $monolog;
175
    }
176
177
    /**
178
     * Set handler for Syslog.
179
     *
180
     * @param Logger $monolog
181
     *
182
     * @return Logger
183
     */
184 View Code Duplication
    private function setSyslogHandler($monolog)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
185
    {
186
        $required = ['syslog_enabled', 'syslog_ident', 'syslog_facility'];
187
        if (!$this->checkRequiredFields($required)) {
188
            return $monolog;
189
        }
190
191
        $ident = Settings::get('syslog_ident');
192
        $facility = Settings::get('syslog_facility');
193
        $level = Settings::get('syslog_level', 100);
194
        $handler = new SyslogHandler($ident, $facility, $level);
195
        $monolog->pushHandler($handler);
196
197
        return $monolog;
198
    }
199
200
    /**
201
     * Set handler for New Relic.
202
     *
203
     * @param Logger $monolog
204
     *
205
     * @return Logger
206
     */
207 View Code Duplication
    private function setNewrelicHandler($monolog)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
208
    {
209
        $required = ['newrelic_enabled', 'newrelic_appname'];
210
        if (!$this->checkRequiredFields($required)) {
211
            return $monolog;
212
        }
213
214
        $appname = Settings::get('newrelic_appname');
215
        $level = Settings::get('newrelic_level', 100);
216
        $bubble = true;
217
        $handler = new NewRelicHandler($level, $bubble, $appname);
218
        $monolog->pushHandler($handler);
219
220
        return $monolog;
221
    }
222
223
    /**
224
     * Check each required field if exist and not empty.
225
     *
226
     * @param array $fields
227
     *
228
     * @return bool
229
     */
230
    private function checkRequiredFields(array $fields)
231
    {
232
        foreach ($fields as $field) {
233
            $value = Settings::get($field);
234
            if (!$value || empty($value)) {
235
                return false;
236
            }
237
        }
238
239
        return true;
240
    }
241
}
242