aboutsummaryrefslogtreecommitdiff
path: root/packet/notifications.py
blob: 5ec511a3e6db82dacf8a7d7567a72bd74f8d39d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from datetime import datetime
from typing import Any, Callable, TypeVar, cast

import onesignal

from packet import app, intro_onesignal_client, csh_onesignal_client
from packet.models import NotificationSubscription, Packet

post_body = {
    'contents': {'en': 'Default message'},
    'headings': {'en': 'Default Title'},
    'chrome_web_icon': app.config['PROTOCOL'] + app.config['SERVER_NAME'] + '/static/android-chrome-512x512.png',
    'chrome_web_badge': app.config['PROTOCOL'] + app.config['SERVER_NAME'] + '/static/android-chrome-512x512.png',
    'url': app.config['PROTOCOL'] + app.config['SERVER_NAME']
}

WrappedFunc = TypeVar('WrappedFunc', bound=Callable)

def require_onesignal_intro(func: WrappedFunc) -> WrappedFunc:
    def require_onesignal_intro_wrapper(*args: list, **kwargs: dict) -> Any:
        if intro_onesignal_client:
            return func(*args, **kwargs)
        return None
    return cast(WrappedFunc, require_onesignal_intro_wrapper)

def require_onesignal_csh(func: WrappedFunc) -> WrappedFunc:
    def require_onesignal_csh_wrapper(*args: list, **kwargs: dict) -> Any:
        if csh_onesignal_client:
            return func(*args, **kwargs)
        return None
    return cast(WrappedFunc, require_onesignal_csh_wrapper)


def send_notification(notification_body: dict, subscriptions: list, client: onesignal.Client) -> None:
    tokens = list(map(lambda subscription: subscription.token, subscriptions))
    if tokens:
        notification = onesignal.Notification(post_body=notification_body)
        notification.post_body['include_player_ids'] = tokens
        onesignal_response = client.send_notification(notification)
        if onesignal_response.status_code == 200:
            app.logger.info('The notification ({}) sent out successfully'.format(notification.post_body))
        else:
            app.logger.warn('The notification ({}) was unsuccessful'.format(notification.post_body))


@require_onesignal_intro
def packet_signed_notification(packet: Packet, signer: str) -> None:
    subscriptions = NotificationSubscription.query.filter_by(freshman_username=packet.freshman_username)
    if subscriptions:
        notification_body = post_body
        notification_body['contents']['en'] = signer + ' signed your packet!'
        notification_body['headings']['en'] = 'New Packet Signature!'
        notification_body['chrome_web_icon'] = 'https://profiles.csh.rit.edu/image/' + signer
        notification_body['url'] = app.config['PROTOCOL'] + app.config['PACKET_INTRO']

        send_notification(notification_body, subscriptions, intro_onesignal_client)


@require_onesignal_csh
@require_onesignal_intro
def packet_100_percent_notification(packet: Packet) -> None:
    member_subscriptions = NotificationSubscription.query.filter(cast(Any, NotificationSubscription.member).isnot(None))
    intro_subscriptions = NotificationSubscription.query.filter(
            cast(Any, NotificationSubscription.freshman_username).isnot(None))
    if member_subscriptions or intro_subscriptions:
        notification_body = post_body
        notification_body['contents']['en'] = packet.freshman.name + ' got 💯 on packet!'
        notification_body['headings']['en'] = 'New 100% on Packet!'
        # TODO: Issue #156
        notification_body['chrome_web_icon'] = 'https://profiles.csh.rit.edu/image/' + packet.freshman_username

        send_notification(notification_body, member_subscriptions, csh_onesignal_client)
        send_notification(notification_body, intro_subscriptions, intro_onesignal_client)


@require_onesignal_intro
def packet_starting_notification(packet: Packet) -> None:
    subscriptions = NotificationSubscription.query.filter_by(freshman_username=packet.freshman_username)
    if subscriptions:
        notification_body = post_body
        notification_body['contents']['en'] = 'Log into your packet, and get started meeting people!'
        notification_body['headings']['en'] = 'Your packet has begun!'
        notification_body['url'] = app.config['PROTOCOL'] + app.config['PACKET_INTRO']
        notification_body['send_after'] = packet.start.strftime('%Y-%m-%d %H:%M:%S')

        send_notification(notification_body, subscriptions, intro_onesignal_client)


@require_onesignal_csh
def packets_starting_notification(start_date: datetime) -> None:
    member_subscriptions = NotificationSubscription.query.filter(cast(Any, NotificationSubscription.member).isnot(None))
    if member_subscriptions:
        notification_body = post_body
        notification_body['contents']['en'] = 'New packets have started, visit packet to see them!'
        notification_body['headings']['en'] = 'Packets Start Today!'
        notification_body['send_after'] = start_date.strftime('%Y-%m-%d %H:%M:%S')

        send_notification(notification_body, member_subscriptions, csh_onesignal_client)