From f8223286e058e2ef27b4cde733f2faa51521e5c7 Mon Sep 17 00:00:00 2001 From: Aaron Fordham Date: Fri, 11 Sep 2015 10:32:43 +0000 Subject: [PATCH] Adding moon phase module --- i3pystatus/moon.py | 193 +++++++++++++++++++++------------------------ 1 file changed, 92 insertions(+), 101 deletions(-) diff --git a/i3pystatus/moon.py b/i3pystatus/moon.py index e049fa9..8e19819 100644 --- a/i3pystatus/moon.py +++ b/i3pystatus/moon.py @@ -2,8 +2,10 @@ from i3pystatus import IntervalModule, formatp import datetime import math + import decimal import os + from i3pystatus.core.util import TimeWrapper dec = decimal.Decimal @@ -11,117 +13,106 @@ dec = decimal.Decimal # Moon phase module class MoonPhase(IntervalModule): + """ + Available Formatters - """ - Available Formatters + status: Allows for mapping of current moon phase to various + - New Moon: + - Waxing Crescent: + - First Quarter: + - Waxing Gibbous: + - Full Moon: + - Waning Gibbous: + - Last Quarter: + - Waning Crescent: - status: Allow for mapping of current moon phase - status { + """ - New Moon: - Waxing Crescent: - First Quarter: - Waxing Gibbous: - Full Moon: - Waning Gibbous: - Last Quarter: - Waning Crescent: - } - """ + settings = ( + "format", + ("status", "Current moon phase"), + ("illum", "Percentage that is illuminated"), + ("color", "Set color"), - settings = ( - "format", - ("status", "Current moon phase"), - ("illum", "Percentage that is illuminated"), - ("color", "Set color"), + ) - ) + format = "{illum} {status}" - format = "{illum} {status}" + interval = 60 * 60 * 2 # every 2 hours - interval = 60 * 60 * 2 # every 2 hours + status = { - status = { + "New Moon": "NM", + "Waxing Crescent": "WaxCres", + "First Quarter": "FQ", + "Waxing Gibbous": "WaxGib", + "Full Moon": "FM", + "Waning Gibbous": "WanGib", + "Last Quarter": "LQ", + "Waning Cresent": "WanCres", - "New Moon": "NM", - "Waxing Crescent": "WaxCres", - "First Quarter": "FQ", - "Waxing Gibbous": "WaxGib", - "Full Moon": "FM", - "Waning Gibbous": "WanGib", - "Last Quarter": "LQ", - "Waning Cresent": "WanCres", + } + color = { + "New Moon": "#00BDE5", + "Waxing Crescent": "#138DD8", + "First Quarter": "#265ECC", + "Waxing Gibbous": "#392FBF", + "Full Moon": "#4C00B3", + "Waning Gibbous": "#871181", + "Last Quarter": "#C32250", + "Waning Crescent": "#FF341F", + } + + def pos(now=None): + days_in_second = 86400 + + now = datetime.datetime.now() + difference = now - datetime.datetime(2001, 1, 1) + + days = dec(difference.days) + (dec(difference.seconds) / dec(days_in_second)) + lunarCycle = dec("0.20439731") + (days * dec("0.03386319269")) + + return lunarCycle % dec(1) + + def current_phase(self): + + lunarCycle = self.pos() + + index = (lunarCycle * dec(8)) + dec("0.5") + index = math.floor(index) + + return { + 0: "New Moon", + 1: "Waxing Crescent", + 2: "First Quarter", + 3: "Waxing Gibbous", + 4: "Full Moon", + 5: "Waning Gibbous", + 6: "Last Quarter", + 7: "Waning Crescent", + }[int(index) & 7] + + def illum(self): + phase = 0 + lunarCycle = float(self.pos()) * 100 + + if lunarCycle > 50: + phase = 100 - lunarCycle + + else: + phase = lunarCycle * 2 + + return phase + + def run(self): + + fdict = { + "status": self.status[self.current_phase()], + "illum": self.illum(), } - color = "#ffffff" - - phase_color = { - "New Moon": "#00BDE5", - "Waxing Crescent": "#138DD8", - "First Quarter": "#265ECC", - "Waxing Gibbous": "#392FBF", - "Full Moon": "#4C00B3", - "Waning Gibbous": "#871181", - "Last Quarter": "#C32250", - "Waning Crescent": "#FF341F", + self.output = { + "full_text": formatp(self.format, **fdict), + "color": self.color[self.current_phase()], } - - def pos(now=None): - now = None - days_in_second = 86400 - - if now is None: - now = datetime.datetime.now() - - difference = now - datetime.datetime(2001, 1, 1) - - days = dec(difference.days) + (dec(difference.seconds) / dec(days_in_second)) - - lunarCycle = dec("0.20439731") + (days * dec("0.03386319269")) - - return lunarCycle % dec(1) - - def current_phase(self): - - lunarCycle = self.pos() - - index = (lunarCycle * dec(8)) + dec("0.5") - index = math.floor(index) - - return { - 0: "New Moon", - 1: "Waxing Crescent", - 2: "First Quarter", - 3: "Waxing Gibbous", - 4: "Full Moon", - 5: "Waning Gibbous", - 6: "Last Quarter", - 7: "Waning Crescent", - }[int(index) & 7] - - def illum(self): - phase = 0 - lunarCycle = float(self.pos()) * 100 - - if lunarCycle > 50: - phase = 100 - lunarCycle - - else: - phase = lunarCycle * 2 - - return phase - - def run(self): - - color = self.color - - fdict = { - "status": self.status[self.current_phase()], - "illum": self.illum(), - } - - self.output = { - "full_text": formatp(self.format, **fdict), - "color": self.phase_color[self.current_phase()], - }