Completed
Push — master ( 72b331...d4b7d2 )
by Steffen
02:14
created

kuon.watcher.notifications.telegram   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 17
eloc 60
dl 0
loc 119
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A Telegram.__init__() 0 13 3
A Telegram.get_me() 0 9 1
A Telegram.get_last_chat_id_and_text() 0 14 2
A Telegram.get_updates() 0 25 5
B Telegram.send_message() 0 34 6
1
#!/usr/bin/python
2
# -*- coding: utf-8 -*-
3
4
import requests
5
6
from kuon.api_response import APIResponse
7
from kuon.watcher.settings import Settings
8
9
10
class InvalidApiSettingsException(Exception):
11
    pass
12
13
14
class Telegram:
15
    """
16
    Class to notify the user via telegram bot.
17
    The telegram API documentation can be found here: https://core.telegram.org/bots/api
18
    """
19
20
    def __init__(self):
21
        """Initializing function"""
22
        if not Settings.Notification.Telegram.token:
23
            raise InvalidApiSettingsException('You need an API token to use the Telegram API')
24
25
        self._token = Settings.Notification.Telegram.token
26
        self.api_url = "https://api.telegram.org/bot{0:s}".format(self._token)
27
28
        bot_profile = self.get_me()
29
        if not bot_profile.ok:
30
            raise InvalidApiSettingsException('The provided API key is invalid')
31
32
        self._chat_id = Settings.Notification.Telegram.chat_id
33
34
    def get_me(self):
35
        """getMe implementation
36
        https://core.telegram.org/bots/api#getme
37
38
        :return:
39
        """
40
        api_url = "{0:s}/getMe".format(self.api_url)
41
        link = requests.get(api_url)
42
        return APIResponse(link.text)
43
44
    def get_updates(self, offset=None, limit=None, timeout=None, allowed_updates=None):
45
        """getUpdates implementation
46
        https://core.telegram.org/bots/api#getupdates
47
48
        :param offset:
49
        :param limit:
50
        :param timeout:
51
        :param allowed_updates:
52
        :return:
53
        """
54
        api_url = "{0:s}/getUpdates".format(self.api_url)
55
56
        payload = {}
57
58
        if offset:
59
            payload['offset'] = offset
60
        if limit:
61
            payload['limit'] = limit
62
        if timeout:
63
            payload['timeout'] = timeout
64
        if allowed_updates:
65
            payload['allowed_updates'] = allowed_updates
66
67
        link = requests.get(api_url)
68
        return APIResponse(link.text)
69
70
    def send_message(self, text, chat_id: int, parse_mode=None, disable_web_page_preview=None,
71
                     disable_notification=False, reply_to_message_id=None, reply_markup=None):
72
        """sendMessage implementation
73
        https://core.telegram.org/bots/api#sendmessage
74
75
        :param text:
76
        :param chat_id:
77
        :param parse_mode:
78
        :param disable_web_page_preview:
79
        :param disable_notification:
80
        :param reply_to_message_id:
81
        :param reply_markup:
82
        :return:
83
        """
84
        api_url = "{0:s}/sendMessage".format(self.api_url)
85
86
        payload = {
87
            'text': text,
88
            'chat_id': chat_id
89
        }
90
91
        if parse_mode:
92
            payload['parse_mode'] = parse_mode
93
        if disable_web_page_preview:
94
            payload['disable_web_page_preview'] = disable_web_page_preview
95
        if disable_notification:
96
            payload['disable_notification'] = disable_notification
97
        if reply_to_message_id:
98
            payload['reply_to_message_id'] = reply_to_message_id
99
        if reply_markup:
100
            payload['reply_markup'] = reply_markup
101
102
        link = requests.get(api_url, params=payload)
103
        return APIResponse(link.text)
104
105
    def get_last_chat_id_and_text(self):
106
        """Retrieve the last message and chat id
107
108
        :return:
109
        """
110
        updates = self.get_updates()
111
        if not updates.result:
112
            # Bot didn't receive any new messages
113
            return None, ""
114
115
        last_update = len(updates.result) - 1
116
        text = updates.result[last_update].message.text
117
        chat_id = updates.result[last_update].message.chat.id
118
        return chat_id, text
119