diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 515a5fe7..6435955e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ services: before_script: - apk add --no-cache python3 - - pip3 install pylint requests discord.py docker pylint wolframalpha beautifulsoup4 + - pip3 install pylint requests discord.py docker pylint wolframalpha pyowm beautifulsoup4 stages: - test diff --git a/Dockerfile b/Dockerfile index 708a215b..dc8e08cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.6.2-alpine3.6 LABEL name="Dragon Bot" RUN apk update && apk add --no-cache docker -RUN pip install requests discord.py docker wolframalpha beautifulsoup4 +RUN pip install requests discord.py docker wolframalpha pyowm beautifulsoup4 ADD app /app CMD python app/dragon-bot.py diff --git a/Dockerfile-test-env b/Dockerfile-test-env index bfab36c8..a56e5f94 100644 --- a/Dockerfile-test-env +++ b/Dockerfile-test-env @@ -2,7 +2,7 @@ FROM python:3.6.2-alpine3.6 LABEL name="Dragon Bot Test environment" RUN apk update && apk add --no-cache vim docker -RUN pip install requests discord.py docker pylint wolframalpha beautifulsoup4 +RUN pip install requests discord.py docker pylint wolframalpha pyowm beautifulsoup4 ADD app /app RUN printf "\n\nTesting your python code for errors\n\n" && \ diff --git a/app/weather.py b/app/weather.py new file mode 100644 index 00000000..311ae871 --- /dev/null +++ b/app/weather.py @@ -0,0 +1,66 @@ +import requests +from pyowm import OWM +from pyowm import exceptions + +days_from_ind = {0: 'Today', 1: 'Tomorrow', 2: 'Day after tomorrow'} +emojis = {'clear sky': ':sunny:', 'scattered clouds': ':partly_sunny:', + 'light rain': ':white_sun_rain_cloud:', 'overcast clouds': ':cloud:', + 'broken clouds': ':white_sun_cloud:', 'moderate rain': ':cloud_with_rain:', + 'light snow': ':cloud_snow:', 'few clouds': ':white_sun_small_cloud:'} + +def get_weather(location): + """ + get_weather(location) + + Returns the weather forecast for the selected location. Uses PythonOWM to + make life super easy. + + TODO: Replace basic code block with nice looking, bold text w/ emojis + """ + try: + openweathermap = OWM('593e0e182f9278a10443da354c4014db') + forecaster = openweathermap.three_hours_forecast(location) + forecast = forecaster.get_forecast() + + reg = forecast.get(0) + location = forecast.get_location().get_name() + indicator = int(reg.get_reference_time(timeformat='iso')[11:13]) // 3 + + curr_stat = '{}{}{}{}{}'.format(' \n***Status in ', location, ':*** *', + reg.get_detailed_status().title(), '*\n') + curr_temp = '{}{}{}'.format('**Current Temperature:** *', + str(reg.get_temperature('fahrenheit').get('temp')), + 'F*\n\n__**3 day forecast:**__\n') + forecast_str = '{}{}'.format(curr_stat, curr_temp) + + ind = 0 + for i in range((4 - indicator) % 8, int((3 * len(forecast)) / 5), 8): + high, low = 0, 100000 + for j in range(0, 8): + if (i + j < (3 * len(forecast)) / 5): + day = forecast.get(i + j) + else: + break + + temps = day.get_temperature('fahrenheit') + h = temps.get('temp_max') + l = temps.get('temp_min') + print(forecast.get(i + j).get_detailed_status()) + if high < h: + high = h + if low > l: + low = l + + day = '{}{}{}'.format('***', days_from_ind.get(ind), '***\n') + weather_stat = '{}{}{}{}{}'.format('**Status:** *', + forecast.get(i).get_detailed_status().title(), + '* ', emojis.get(forecast.get(i).get_detailed_status()), '\n') + high_temp = '{}{}{}'.format('**High:** *', str(high), 'F*\n') + low_temp = '{}{}{}'.format('**Low:** *', str(low), 'F*\n\n') + forecast_str = '{}{}{}{}{}'.format( + forecast_str, day, weather_stat, high_temp, low_temp) + ind += 1 + + return forecast_str + except exceptions.not_found_error.NotFoundError: + return 'Please input a valid location'