notify.py 20.1 KB
Newer Older
1
#!/usr/bin/env python3
2
3
4
5
6
7

import email.mime.text
import subprocess
import sys
import textwrap

Lukas Fleischer's avatar
Lukas Fleischer committed
8
9
import aurweb.config
import aurweb.db
Lukas Fleischer's avatar
Lukas Fleischer committed
10
import aurweb.l10n
11

Lukas Fleischer's avatar
Lukas Fleischer committed
12
aur_location = aurweb.config.get('options', 'aur_location')
13
14


15
16
17
def headers_cc(cclist):
    return {'Cc': str.join(', ', cclist)}

18

19
20
21
def headers_msgid(thread_id):
    return {'Message-ID': thread_id}

22

23
24
25
def headers_reply(thread_id):
    return {'In-Reply-To': thread_id, 'References': thread_id}

26

Lukas Fleischer's avatar
Lukas Fleischer committed
27
28
def username_from_id(conn, uid):
    cur = conn.execute('SELECT UserName FROM Users WHERE ID = ?', [uid])
29
30
    return cur.fetchone()[0]

31

Lukas Fleischer's avatar
Lukas Fleischer committed
32
33
34
def pkgbase_from_id(conn, pkgbase_id):
    cur = conn.execute('SELECT Name FROM PackageBases WHERE ID = ?',
                       [pkgbase_id])
35
36
    return cur.fetchone()[0]

37

Lukas Fleischer's avatar
Lukas Fleischer committed
38
39
40
def pkgbase_from_pkgreq(conn, reqid):
    cur = conn.execute('SELECT PackageBaseID FROM PackageRequests ' +
                       'WHERE ID = ?', [reqid])
41
42
    return cur.fetchone()[0]

43

44
class Notification:
Lukas Fleischer's avatar
Lukas Fleischer committed
45
46
47
    def __init__(self):
        self._l10n = aurweb.l10n.Translator()

48
49
50
51
52
53
    def get_refs(self):
        return ()

    def get_headers(self):
        return {}

Lukas Fleischer's avatar
Lukas Fleischer committed
54
    def get_body_fmt(self, lang):
55
        body = ''
Lukas Fleischer's avatar
Lukas Fleischer committed
56
        for line in self.get_body(lang).splitlines():
57
58
59
            body += textwrap.fill(line, break_long_words=False) + '\n'
        for i, ref in enumerate(self.get_refs()):
            body += '\n' + '[%d] %s' % (i + 1, ref)
Lukas Fleischer's avatar
Lukas Fleischer committed
60
        return body.rstrip()
61

Lukas Fleischer's avatar
Lukas Fleischer committed
62
    def send(self):
63
64
65
66
67
        sendmail = aurweb.config.get('notifications', 'sendmail')
        sender = aurweb.config.get('notifications', 'sender')
        reply_to = aurweb.config.get('notifications', 'reply-to')

        for recipient in self.get_recipients():
Lukas Fleischer's avatar
Lukas Fleischer committed
68
69
70
71
            to, lang = recipient
            msg = email.mime.text.MIMEText(self.get_body_fmt(lang),
                                           'plain', 'utf-8')
            msg['Subject'] = self.get_subject(lang)
72
73
            msg['From'] = sender
            msg['Reply-to'] = reply_to
Lukas Fleischer's avatar
Lukas Fleischer committed
74
            msg['To'] = to
75
76
77
78
79
80
81
82
83
84
85

            for key, value in self.get_headers().items():
                msg[key] = value

            p = subprocess.Popen([sendmail, '-t', '-oi'],
                                 stdin=subprocess.PIPE)
            p.communicate(msg.as_bytes())


class ResetKeyNotification(Notification):
    def __init__(self, conn, uid):
Lukas Fleischer's avatar
Lukas Fleischer committed
86
87
88
89
        cur = conn.execute('SELECT UserName, Email, LangPreference, ' +
                           'ResetKey FROM Users WHERE ID = ?', [uid])
        self._username, self._to, self._lang, self._resetkey = cur.fetchone()
        super().__init__()
90
91

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
92
        return [(self._to, self._lang)]
93

Lukas Fleischer's avatar
Lukas Fleischer committed
94
95
    def get_subject(self, lang):
        return self._l10n.translate('AUR Password Reset', lang)
96

Lukas Fleischer's avatar
Lukas Fleischer committed
97
98
99
100
101
102
103
    def get_body(self, lang):
        return self._l10n.translate(
                'A password reset request was submitted for the account %s '
                'associated with your email address. If you wish to reset '
                'your password follow the link [1] below, otherwise ignore '
                'this message and nothing will happen.', lang) % \
                (self._username)
104
105
106
107
108
109

    def get_refs(self):
        return (aur_location + '/passreset/?resetkey=' + self._resetkey,)


class WelcomeNotification(ResetKeyNotification):
Lukas Fleischer's avatar
Lukas Fleischer committed
110
111
112
    def get_subject(self, lang):
        return self._l10n.translate('Welcome to the Arch User Repository',
                                    lang)
113

Lukas Fleischer's avatar
Lukas Fleischer committed
114
115
116
117
118
119
    def get_body(self, lang):
        return self._l10n.translate(
                'Welcome to the Arch User Repository! In order to set an '
                'initial password for your new account, please click the '
                'link [1] below. If the link does not work, try copying and '
                'pasting it into your browser.', lang)
120
121
122
123
124
125


class CommentNotification(Notification):
    def __init__(self, conn, uid, pkgbase_id, comment_id):
        self._user = username_from_id(conn, uid)
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
126
127
        cur = conn.execute('SELECT DISTINCT Users.Email, Users.LangPreference '
                           'FROM Users INNER JOIN PackageNotifications ' +
128
129
130
131
132
                           'ON PackageNotifications.UserID = Users.ID WHERE ' +
                           'Users.CommentNotify = 1 AND ' +
                           'PackageNotifications.UserID != ? AND ' +
                           'PackageNotifications.PackageBaseID = ?',
                           [uid, pkgbase_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
133
        self._recipients = cur.fetchall()
134
135
136
        cur = conn.execute('SELECT Comments FROM PackageComments WHERE ID = ?',
                           [comment_id])
        self._text = cur.fetchone()[0]
Lukas Fleischer's avatar
Lukas Fleischer committed
137
        super().__init__()
138
139

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
140
        return self._recipients
141

Lukas Fleischer's avatar
Lukas Fleischer committed
142
143
144
    def get_subject(self, lang):
        return self._l10n.translate('AUR Comment for %s', lang) % \
                (self._pkgbase)
145

Lukas Fleischer's avatar
Lukas Fleischer committed
146
147
148
149
    def get_body(self, lang):
        body = self._l10n.translate(
                '%s [1] added the following comment to %s [2]:', lang) % \
                (self._user, self._pkgbase)
150
        body += '\n\n' + self._text + '\n\n'
Lukas Fleischer's avatar
Lukas Fleischer committed
151
152
153
154
155
        dnlabel = self._l10n.translate('Disable notifications', lang)
        body += self._l10n.translate(
                'If you no longer wish to receive notifications about this '
                'package, please go to the package page [2] and select '
                '"%s".', lang) % dnlabel
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
        return body

    def get_refs(self):
        return (aur_location + '/account/' + self._user + '/',
                aur_location + '/pkgbase/' + self._pkgbase + '/')

    def get_headers(self):
        thread_id = '<pkg-notifications-' + self._pkgbase + \
                    '@aur.archlinux.org>'
        return headers_reply(thread_id)


class UpdateNotification(Notification):
    def __init__(self, conn, uid, pkgbase_id):
        self._user = username_from_id(conn, uid)
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
172
173
        cur = conn.execute('SELECT DISTINCT Users.Email, ' +
                           'Users.LangPreference FROM Users ' +
174
175
176
177
178
179
                           'INNER JOIN PackageNotifications ' +
                           'ON PackageNotifications.UserID = Users.ID WHERE ' +
                           'Users.UpdateNotify = 1 AND ' +
                           'PackageNotifications.UserID != ? AND ' +
                           'PackageNotifications.PackageBaseID = ?',
                           [uid, pkgbase_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
180
181
        self._recipients = cur.fetchall()
        super().__init__()
182
183

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
184
        return self._recipients
185

Lukas Fleischer's avatar
Lukas Fleischer committed
186
187
188
    def get_subject(self, lang):
        return self._l10n.translate('AUR Package Update: %s', lang) % \
                (self._pkgbase)
189

Lukas Fleischer's avatar
Lukas Fleischer committed
190
191
192
    def get_body(self, lang):
        body = self._l10n.translate('%s [1] pushed a new commit to %s [2].',
                                    lang) % (self._user, self._pkgbase)
193
        body += '\n\n'
Lukas Fleischer's avatar
Lukas Fleischer committed
194
195
196
197
198
        dnlabel = self._l10n.translate('Disable notifications', lang)
        body += self._l10n.translate(
                'If you no longer wish to receive notifications about this '
                'package, please go to the package page [2] and select '
                '"%s".', lang) % dnlabel
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
        return body

    def get_refs(self):
        return (aur_location + '/account/' + self._user + '/',
                aur_location + '/pkgbase/' + self._pkgbase + '/')

    def get_headers(self):
        thread_id = '<pkg-notifications-' + self._pkgbase + \
                    '@aur.archlinux.org>'
        return headers_reply(thread_id)


class FlagNotification(Notification):
    def __init__(self, conn, uid, pkgbase_id):
        self._user = username_from_id(conn, uid)
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
215
216
        cur = conn.execute('SELECT DISTINCT Users.Email, ' +
                           'Users.LangPreference FROM Users ' +
217
218
219
220
221
222
                           'LEFT JOIN PackageComaintainers ' +
                           'ON PackageComaintainers.UsersID = Users.ID ' +
                           'INNER JOIN PackageBases ' +
                           'ON PackageBases.MaintainerUID = Users.ID OR ' +
                           'PackageBases.ID = PackageComaintainers.PackageBaseID ' +
                           'WHERE PackageBases.ID = ?', [pkgbase_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
223
        self._recipients = cur.fetchall()
224
225
226
        cur = conn.execute('SELECT FlaggerComment FROM PackageBases WHERE ' +
                           'ID = ?', [pkgbase_id])
        self._text = cur.fetchone()[0]
Lukas Fleischer's avatar
Lukas Fleischer committed
227
        super().__init__()
228
229

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
230
        return self._recipients
231

Lukas Fleischer's avatar
Lukas Fleischer committed
232
233
234
    def get_subject(self, lang):
        return self._l10n.translate('AUR Out-of-date Notification for %s',
                                    lang) % (self._pkgbase)
235

Lukas Fleischer's avatar
Lukas Fleischer committed
236
237
238
239
    def get_body(self, lang):
        body = self._l10n.translate(
                'Your package %s [1] has been flagged out-of-date by '
                '%s [2]:', lang) % (self._pkgbase, self._user)
240
241
242
243
244
245
246
247
248
249
250
251
        body += '\n\n' + self._text
        return body

    def get_refs(self):
        return (aur_location + '/pkgbase/' + self._pkgbase + '/',
                aur_location + '/account/' + self._user + '/')


class OwnershipEventNotification(Notification):
    def __init__(self, conn, uid, pkgbase_id):
        self._user = username_from_id(conn, uid)
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
252
253
        cur = conn.execute('SELECT DISTINCT Users.Email, ' +
                           'Users.LangPreference FROM Users ' +
254
255
256
257
258
259
                           'INNER JOIN PackageNotifications ' +
                           'ON PackageNotifications.UserID = Users.ID WHERE ' +
                           'Users.OwnershipNotify = 1 AND ' +
                           'PackageNotifications.UserID != ? AND ' +
                           'PackageNotifications.PackageBaseID = ?',
                           [uid, pkgbase_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
260
        self._recipients = cur.fetchall()
261
262
263
        cur = conn.execute('SELECT FlaggerComment FROM PackageBases WHERE ' +
                           'ID = ?', [pkgbase_id])
        self._text = cur.fetchone()[0]
Lukas Fleischer's avatar
Lukas Fleischer committed
264
        super().__init__()
265
266

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
267
        return self._recipients
268

Lukas Fleischer's avatar
Lukas Fleischer committed
269
270
271
    def get_subject(self, lang):
        return self._l10n.translate('AUR Ownership Notification for %s',
                                    lang) % (self._pkgbase)
272
273
274
275
276
277
278

    def get_refs(self):
        return (aur_location + '/pkgbase/' + self._pkgbase + '/',
                aur_location + '/account/' + self._user + '/')


class AdoptNotification(OwnershipEventNotification):
Lukas Fleischer's avatar
Lukas Fleischer committed
279
280
281
282
    def get_body(self, lang):
        return self._l10n.translate(
                'The package %s [1] was adopted by %s [2].', lang) % \
                (self._pkgbase, self._user)
283
284
285
286


class DisownNotification(OwnershipEventNotification):
    def get_body(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
287
288
289
        return self._l10n.translate(
                'The package %s [1] was disowned by %s [2].', lang) % \
                (self._pkgbase, self._user)
290
291
292
293
294


class ComaintainershipEventNotification(Notification):
    def __init__(self, conn, uid, pkgbase_id):
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
295
296
297
298
        cur = conn.execute('SELECT Email, LangPreference FROM Users ' +
                           'WHERE ID = ?', [uid])
        self._to, self._lang = cur.fetchone()
        super().__init__()
299
300

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
301
        return [(self._to, self._lang)]
302

Lukas Fleischer's avatar
Lukas Fleischer committed
303
304
305
    def get_subject(self, lang):
        return self._l10n.translate('AUR Co-Maintainer Notification for %s',
                                    lang) % (self._pkgbase)
306
307
308
309
310
311

    def get_refs(self):
        return (aur_location + '/pkgbase/' + self._pkgbase + '/',)


class ComaintainerAddNotification(ComaintainershipEventNotification):
Lukas Fleischer's avatar
Lukas Fleischer committed
312
313
314
315
    def get_body(self, lang):
        return self._l10n.translate(
                'You were added to the co-maintainer list of %s [1].',
                lang) % (self._pkgbase)
316
317
318


class ComaintainerRemoveNotification(ComaintainershipEventNotification):
Lukas Fleischer's avatar
Lukas Fleischer committed
319
320
321
322
    def get_body(self, lang):
        return self._l10n.translate(
                'You were removed from the co-maintainer list of %s [1].',
                lang) % (self._pkgbase)
323
324
325
326
327
328
329
330
331
332


class DeleteNotification(Notification):
    def __init__(self, conn, uid, old_pkgbase_id, new_pkgbase_id=None):
        self._user = username_from_id(conn, uid)
        self._old_pkgbase = pkgbase_from_id(conn, old_pkgbase_id)
        if new_pkgbase_id:
            self._new_pkgbase = pkgbase_from_id(conn, new_pkgbase_id)
        else:
            self._new_pkgbase = None
Lukas Fleischer's avatar
Lukas Fleischer committed
333
334
        cur = conn.execute('SELECT DISTINCT Users.Email, ' +
                           'Users.LangPreference FROM Users ' +
335
336
337
338
339
                           'INNER JOIN PackageNotifications ' +
                           'ON PackageNotifications.UserID = Users.ID WHERE ' +
                           'PackageNotifications.UserID != ? AND ' +
                           'PackageNotifications.PackageBaseID = ?',
                           [uid, old_pkgbase_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
340
341
        self._recipients = cur.fetchall()
        super().__init__()
342
343

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
344
        return self._recipients
345

Lukas Fleischer's avatar
Lukas Fleischer committed
346
347
348
    def get_subject(self, lang):
        return self._l10n.translate('AUR Package deleted: %s', lang) % \
                (self._old_pkgbase)
349

Lukas Fleischer's avatar
Lukas Fleischer committed
350
    def get_body(self, lang):
351
        if self._new_pkgbase:
Lukas Fleischer's avatar
Lukas Fleischer committed
352
353
354
355
356
357
            dnlabel = self._l10n.translate('Disable notifications', lang)
            return self._l10n.translate(
                    '%s [1] merged %s [2] into %s [3].\n\n'
                    'If you no longer wish receive notifications about the '
                    'new package, please go to [3] and click "%s".', lang) % \
                    (self._user, self._old_pkgbase, self._new_pkgbase, dnlabel)
358
        else:
Lukas Fleischer's avatar
Lukas Fleischer committed
359
360
361
362
            return self._l10n.translate(
                    '%s [1] deleted %s [2].\n\n'
                    'You will no longer receive notifications about this '
                    'package.', lang) % (self._user, self._old_pkgbase)
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392

    def get_refs(self):
        refs = (aur_location + '/account/' + self._user + '/',
                aur_location + '/pkgbase/' + self._old_pkgbase + '/')
        if self._new_pkgbase:
            refs += (aur_location + '/pkgbase/' + self._new_pkgbase + '/',)
        return refs


class RequestOpenNotification(Notification):
    def __init__(self, conn, uid, reqid, reqtype, pkgbase_id, merge_into=None):
        self._user = username_from_id(conn, uid)
        self._pkgbase = pkgbase_from_id(conn, pkgbase_id)
        cur = conn.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' +
                           'INNER JOIN PackageBases ' +
                           'ON PackageBases.ID = PackageRequests.PackageBaseID ' +
                           'INNER JOIN Users ' +
                           'ON Users.ID = PackageRequests.UsersID ' +
                           'OR Users.ID = PackageBases.MaintainerUID ' +
                           'WHERE PackageRequests.ID = ?', [reqid])
        self._to = aurweb.config.get('options', 'aur_request_ml')
        self._cc = [row[0] for row in cur.fetchall()]
        cur = conn.execute('SELECT Comments FROM PackageRequests WHERE ID = ?',
                           [reqid])
        self._text = cur.fetchone()[0]
        self._reqid = int(reqid)
        self._reqtype = reqtype
        self._merge_into = merge_into

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
393
        return [(self._to, 'en')]
394

Lukas Fleischer's avatar
Lukas Fleischer committed
395
    def get_subject(self, lang):
396
397
398
        return '[PRQ#%d] %s Request for %s' % \
               (self._reqid, self._reqtype.title(), self._pkgbase)

Lukas Fleischer's avatar
Lukas Fleischer committed
399
    def get_body(self, lang):
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
        if self._merge_into:
            body = '%s [1] filed a request to merge %s [2] into %s [3]:' % \
                   (self._user, self._pkgbase, self._merge_into)
            body += '\n\n' + self._text
        else:
            body = '%s [1] filed a %s request for %s [2]:' % \
                   (self._user, self._reqtype, self._pkgbase)
            body += '\n\n' + self._text
        return body

    def get_refs(self):
        refs = (aur_location + '/account/' + self._user + '/',
                aur_location + '/pkgbase/' + self._pkgbase + '/')
        if self._merge_into:
            refs += (aur_location + '/pkgbase/' + self._merge_into + '/',)
        return refs

    def get_headers(self):
        thread_id = '<pkg-request-' + str(self._reqid) + '@aur.archlinux.org>'
        # Use a deterministic Message-ID for the first email referencing a
        # request.
        headers = headers_msgid(thread_id)
        headers.update(headers_cc(self._cc))
        return headers


class RequestCloseNotification(Notification):
    def __init__(self, conn, uid, reqid, reason):
        self._user = username_from_id(conn, uid) if int(uid) else None
        cur = conn.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' +
                           'INNER JOIN PackageBases ' +
                           'ON PackageBases.ID = PackageRequests.PackageBaseID ' +
                           'INNER JOIN Users ' +
                           'ON Users.ID = PackageRequests.UsersID ' +
                           'OR Users.ID = PackageBases.MaintainerUID ' +
                           'WHERE PackageRequests.ID = ?', [reqid])
        self._to = aurweb.config.get('options', 'aur_request_ml')
        self._cc = [row[0] for row in cur.fetchall()]
        cur = conn.execute('SELECT ClosureComment FROM PackageRequests ' +
                           'WHERE ID = ?', [reqid])
        self._text = cur.fetchone()[0]
        self._reqid = int(reqid)
        self._reason = reason

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
445
        return [(self._to, 'en')]
446

Lukas Fleischer's avatar
Lukas Fleischer committed
447
    def get_subject(self, lang):
448
449
        return '[PRQ#%d] Request %s' % (self._reqid, self._reason.title())

Lukas Fleischer's avatar
Lukas Fleischer committed
450
    def get_body(self, lang):
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
        if self._user:
            body = 'Request #%d has been %s by %s [1]' % \
                   (self._reqid, self._reason, self._user)
        else:
            body = 'Request #%d has been %s automatically by the Arch User ' \
                   'Repository package request system' % \
                   (self._reqid, self._reason)
        if self._text.strip() == '':
            body += '.'
        else:
            body += ':\n\n' + self._text
        return body

    def get_refs(self):
        if self._user:
            return (aur_location + '/account/' + self._user + '/',)
        else:
            return ()

    def get_headers(self):
        thread_id = '<pkg-request-' + str(self._reqid) + '@aur.archlinux.org>'
        headers = headers_reply(thread_id)
        headers.update(headers_cc(self._cc))
        return headers


class TUVoteReminderNotification(Notification):
    def __init__(self, conn, vote_id):
        self._vote_id = int(vote_id)
Lukas Fleischer's avatar
Lukas Fleischer committed
480
        cur = conn.execute('SELECT Email, LangPreference FROM Users ' +
481
482
483
                           'WHERE AccountTypeID IN (2, 4) AND ID NOT IN ' +
                           '(SELECT UserID FROM TU_Votes ' +
                           'WHERE TU_Votes.VoteID = ?)', [vote_id])
Lukas Fleischer's avatar
Lukas Fleischer committed
484
485
        self._recipients = cur.fetchall()
        super().__init__()
486
487

    def get_recipients(self):
Lukas Fleischer's avatar
Lukas Fleischer committed
488
        return self._recipients
489

Lukas Fleischer's avatar
Lukas Fleischer committed
490
491
492
    def get_subject(self, lang):
        return self._l10n.translate('TU Vote Reminder: Proposal %d', lang) % \
                (self._vote_id)
493

Lukas Fleischer's avatar
Lukas Fleischer committed
494
495
496
497
498
    def get_body(self, lang):
        return self._l10n.translate(
                'Please remember to cast your vote on proposal %d [1]. '
                'The voting period ends in less than 48 hours.', lang) % \
                (self._vote_id)
499
500
501

    def get_refs(self):
        return (aur_location + '/tu/?id=' + str(self._vote_id),)
502
503


504
def main():
505
506
    action = sys.argv[1]
    action_map = {
507
508
509
510
511
512
513
514
515
516
517
518
519
        'send-resetkey': ResetKeyNotification,
        'welcome': WelcomeNotification,
        'comment': CommentNotification,
        'update': UpdateNotification,
        'flag': FlagNotification,
        'adopt': AdoptNotification,
        'disown': DisownNotification,
        'comaintainer-add': ComaintainerAddNotification,
        'comaintainer-remove': ComaintainerRemoveNotification,
        'delete': DeleteNotification,
        'request-open': RequestOpenNotification,
        'request-close': RequestCloseNotification,
        'tu-vote-reminder': TUVoteReminderNotification,
520
521
    }

Lukas Fleischer's avatar
Lukas Fleischer committed
522
    conn = aurweb.db.Connection()
523

524
525
    notification = action_map[action](conn, *sys.argv[2:])
    notification.send()
526

Lukas Fleischer's avatar
Lukas Fleischer committed
527
528
    conn.commit()
    conn.close()
529
530
531
532


if __name__ == '__main__':
    main()