diff --git a/papatutuwawa/__init__.py b/papatutuwawa/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/papatutuwawa/mira/__init__.py b/papatutuwawa/mira/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/papatutuwawa/mira/modules/__init__.py b/papatutuwawa/mira/modules/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/mira/modules/pollen.py b/papatutuwawa/mira/modules/pollen.py
similarity index 74%
rename from mira/modules/pollen.py
rename to papatutuwawa/mira/modules/pollen.py
index 2885a41..d4da279 100644
--- a/mira/modules/pollen.py
+++ b/papatutuwawa/mira/modules/pollen.py
@@ -14,7 +14,6 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
'''
-# TODO: Prevent subscriptions when subscribed to 'Alle'
# TODO: remove Alle sollte jede subscription entfernen
# TODO: Deal with weird casing and typos
# TODO: pollen hilfe should print help per command
@@ -63,8 +62,8 @@ class PollenModule(BaseModule):
super().__init__(base, **kwargs)
PollenModule.__instance = self
self._subcommand_table = {
- 'add': self._subscribe,
- 'remove': self._unsubscribe,
+ 'subscribe': self._subscribe,
+ 'unsubscribe': self._unsubscribe,
'hilfe': self._help
}
self._sleep_duration = self.get_option('sleep_duration', 12 * 3600)
@@ -84,11 +83,18 @@ class PollenModule(BaseModule):
'''
msg = '{} (*{}*)\n'.format(date, plz)
- if allergies == ['Alle']:
+ if 'Alle' in [x['type'] for x in allergies]:
allergies = list(self._pollen_data[plz][date].keys)
+ count = 0
for allergy in allergies:
- msg += '{}: {}'.format(allergy, intensity_str(self._pollen_data[plz][date][allergy]))
+ intensity = self._pollen_data[plz][date][allergy['type']]
+ if intensity >= allergy['level']:
+ msg += '{}: {}'.format(allergy['type'], intensity_str(intensity))
+ count += 1
+
+ if count == 0:
+ return ''
return msg
def _is_notified(self, jid, date):
@@ -121,7 +127,10 @@ class PollenModule(BaseModule):
only the data for the pollen types in filter_allergies will be sent.
'''
for plz, data in self._sum.get_subscriptions_for(jid).items():
- allergies = data['data'] if not filter_allergies else filter_allergies
+ if filter_allergies:
+ allergies = filter_allergies
+ else:
+ allergies = data['data']
notified = []
for date in self._pollen_data[plz]:
@@ -129,10 +138,12 @@ class PollenModule(BaseModule):
continue
notified.append(date)
- self.send_message(aioxmpp.JID.fromstr(jid),
- self.notification_body(plz,
- date,
- allergies))
+ msg = self.notification_body(plz,
+ date,
+ allergies)
+ if msg:
+ self.send_message(aioxmpp.JID.fromstr(jid),
+ msg)
if notified:
self._set_dates_notified(jid, notified)
@@ -182,25 +193,40 @@ class PollenModule(BaseModule):
await asyncio.sleep(self._sleep_duration)
async def _subscribe(self, cmd, msg):
- if len(cmd) != 3:
- self.send_message(msg.from_, 'Verwendung: pollen add ')
+ if len(cmd) < 3 or len(cmd) > 4:
+ self.send_message(msg.from_, 'Verwendung: pollen add []')
return
plz = cmd[1]
allergy = cmd[2]
jid = str(msg.from_.bare())
+ level = int(cmd[3]) if len(cmd) == 4 else 0
- if self._sum.is_subscribed_to_data(jid, plz, allergy):
- self.send_message(msg.from_, 'Du hast das schon aboniert')
+ if self._sum.is_subscribed_to_data(jid, plz, 'Alle'):
+ self.send_message(msg.from_, 'Du hast schon alle Allergene abonniert')
return
- self._sum.append_data_for_subscription(jid, plz, allergy)
- self.send_message(msg.from_, 'OK')
+ if self._sum.is_subscribed_to_data(jid, plz, allergy):
+ self.send_message(msg.from_, 'Du hast das schon abonniert')
+ return
+
+ if level < 0 or level > 3:
+ self.send_message(msg.from_, 'Das Level muss zwischen 0 und 3 liegen')
+ return
+
+ self._sum.append_data_for_subscription(jid, plz, {
+ 'type': allergy,
+ 'level': level
+ })
+ self.send_message(msg.from_, 'Du erhälst nun Pollenmeldungen zu %s' % allergy)
# Just some bandwidth saving measure
if plz not in self._pollen_data:
await self._request_pollen_data(False)
- self._broadcast_jid(jid, [allergy])
+ self._broadcast_jid(jid, [{
+ 'type': allergy,
+ 'level': level
+ }])
async def _unsubscribe(self, cmd, msg):
if len(cmd) != 3:
@@ -211,20 +237,28 @@ class PollenModule(BaseModule):
allergy = cmd[2]
jid = str(msg.from_.bare())
- if not self._sum.is_subscribed_to_data(jid, plz, allergy):
- self.send_message(msg.from_, 'Du hast das nicht aboniert')
+ if allergy == 'Alle':
+ self._sum.filter_items_for_subscriptions(jid, plz, lambda x: False)
+ self.send_message(msg.from_, 'Du erhälst keine Pollenmeldungen mehr')
return
- self._sum.remove_data_for_subscription(str(msg.from_.bare()), plz, allergy)
- self.send_message(msg.from_, 'OK')
+ if not self._sum.is_subscribed_to_data_one(jid, plz, lambda x: x['type'] == allergy):
+ self.send_message(msg.from_, 'Du hast %s nicht abonniert' % (allergy))
+ return
+
+ self._sum.filter_items_for_subscription(str(msg.from_.bare()),
+ plz,
+ lambda x: x['type'] != allergy)
+ self.send_message(msg.from_, 'Du erhälst nun keine Pollenmeldungen zu %s mehr' % (allergy))
async def _help(self, cmd, msg):
body = '''Verfügbare Befehle:
-pollen add
-pollen remove
+pollen subscribe []
+pollen unsubscribe
pollen hilfe
-Pollentypen: Ambrosia, Ampfer, Beifuß, Birke, Buche, Eiche, Erle, Esche, Gräser, Hasel, Pappel, Roggen, Ulme, Wegerich, Weide, Alle
+Pollentypen: Ambrosia, Ampfer, Beifuß, Birke, Buche, Eiche, Erle, Esche, Gräser, Hasel, Pappel, Roggen, Ulme, Wegerich, Weide, Alle (Alias für alle Pollentypen)
+Level: 0 (Kein Pollenflug) - 3 (Starker Pollenflug)
'''
self.send_message(msg.from_, body)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..08def8c
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,17 @@
+from setuptools import setup, find_packages
+
+setup(
+ name = 'mira-modules',
+ version = '0.1.0',
+ description = 'Various modules for mira',
+ url = 'https://git.polynom.me/PapaTutuWawa/mira-modules',
+ author = 'Alexander "PapaTutuWawa"',
+ author_email = 'papatutuwawa polynom.me',
+ license = 'GPLv3',
+ packages = find_packages(),
+ install_requires = [
+ 'mira>=0.1.0',
+ 'requests>=2.23.0'
+ ],
+ zip_safe=True
+)