diff --git a/marvin_actions.py b/marvin_actions.py index 3c877cf..80b94ce 100644 --- a/marvin_actions.py +++ b/marvin_actions.py @@ -31,7 +31,6 @@ def getAllActions(): marvinSource, marvinBudord, marvinQuote, - marvinStats, marvinWeather, marvinSun, marvinSayHi, @@ -123,7 +122,7 @@ def marvinExplainShell(row): if not query: return None cmd = " ".join(query) - url = "http://explainshell.com/explain?cmd=" + url = "https://explainshell.com/explain?cmd=" url += quote_plus(cmd, "/:") msg = getString("explainShell") return msg.format(url) @@ -175,12 +174,12 @@ def videoOfToday(): """ Check what day it is and provide a url to a suitable video together with a greeting. """ - dayNum = datetime.date.weekday(datetime.date.today()) + 1 - msg = getString("weekdays", str(dayNum)) - video = getString("video-of-today", str(dayNum)) + weekday = datetime.date.today().strftime("%A") + day = getString("video-of-today", weekday) + msg = day.get("message") - if video: - msg += " En passande video är " + video + if day: + msg += " En passande video är " + day.get("url") else: msg += " Jag har ännu ingen passande video för denna dagen." @@ -221,17 +220,6 @@ def marvinHelp(row): return msg -def marvinStats(row): - """ - Provide a link to the stats. - """ - msg = None - if any(r in row for r in ["stats", "statistik", "ircstats"]): - msg = getString("ircstats") - - return msg - - def marvinSayHi(row): """ Say hi with a nice message. @@ -255,21 +243,23 @@ def marvinLunch(row): Help decide where to eat. """ lunchOptions = { - 'stan centrum karlskrona kna': 'lunch-karlskrona', - 'ängelholm angelholm engelholm': 'lunch-angelholm', - 'hässleholm hassleholm': 'lunch-hassleholm', - 'malmö malmo malmoe': 'lunch-malmo', - 'göteborg goteborg gbg': 'lunch-goteborg' + 'stan centrum karlskrona kna': 'karlskrona', + 'ängelholm angelholm engelholm': 'angelholm', + 'hässleholm hassleholm': 'hassleholm', + 'malmö malmo malmoe': 'malmo', + 'göteborg goteborg gbg': 'goteborg' } - if any(r in row for r in ["lunch", "mat", "äta", "luncha"]): - lunchStr = getString('lunch-message') + data = getString("lunch") + if any(r in row for r in ["lunch", "mat", "äta", "luncha"]): + places = data.get("location").get("bth") for keys, value in lunchOptions.items(): if any(r in row for r in keys.split(" ")): - return lunchStr.format(getString(value)) + places = data.get("location").get(value) - return lunchStr.format(getString('lunch-bth')) + lunchStr = getString("lunch", "message") + return lunchStr.format(places[random.randint(0, len(places) - 1)]) return None @@ -458,7 +448,7 @@ def marvinNameday(row): if any(r in row for r in ["nameday", "namnsdag"]): try: now = datetime.datetime.now() - raw_url = "http://api.dryg.net/dagar/v2.1/{year}/{month}/{day}" + raw_url = "https://api.dryg.net/dagar/v2.1/{year}/{month}/{day}" url = raw_url.format(year=now.year, month=now.month, day=now.day) r = requests.get(url, timeout=5) nameday_data = r.json() diff --git a/marvin_strings.json b/marvin_strings.json index 592b892..a8a2a07 100644 --- a/marvin_strings.json +++ b/marvin_strings.json @@ -1,11 +1,9 @@ { - "source": "I PHP-kurserna kan du länka till source.php. Annars delar du koden som en gist (https://gist.github.com) eller i CodeShare, (http://codeshare.io).", + "source": "I PHP-kurserna kan du länka till source.php. Annars delar du koden som en gist (https://gist.github.com) eller i CodeShare, (https://codeshare.io).", - "whois": "Jag är en tjänstvillig själ som gillar webbprogrammering. Jag bor på GitHub https://github.com/mosbth/irc2phpbb och du kan diskutera mig i forumet http://dbwebb.se/t/20", + "whois": "Jag är en tjänstvillig själ som gillar webbprogrammering. Jag bor på GitHub https://github.com/mosbth/irc2phpbb och du kan diskutera mig i forumet https://dbwebb.se/t/20", - "menu": "[ vem är | le | lunch [var] | citat | budord 1 - 5 | source | väder | solen | dagens video | nöje/paus/strip/comic [slump] | grill | birthday/födelsedag | nameday/namnsdag | stats | google/googla | explain/förklara | uptime | stream | princip | skämt/joke | hjälp ]", - - "ircstats": "Statistik för kanalen finns här: http://dbwebb.se/irssistats/db-o-webb.html", + "menu": "[ vem är | le | lunch [var] | citat | budord 1 - 5 | source | väder | solen | dagens video | nöje/paus/strip/comic [slump] | grill | birthday/födelsedag | nameday/namnsdag | google/googla | explain/förklara | uptime | stream | princip | skämt/joke | hjälp ]", "google": [ "Googla {}", @@ -62,125 +60,133 @@ "budord": { "#1": "Ställ din fråga, länka till exempel och källkod. Häng kvar och vänta på svar.", - "#2": "Var inte rädd för att fråga och fråga tills du får svar: http://dbwebb.se/f/6249", - "#3": "Öva dig ställa smarta frågor: http://dbwebb.se/f/7802", - "#4": "When in doubt - gör ett testprogram. http://dbwebb.se/f/13570", - "#5": "Hey Luke - use the source! http://catb.org/jargon/html/U/UTSL.html" - }, - - - "weekdays": { - "1": "Idag är det måndag.", - "2": "Idag är det tisdag.", - "3": "Idag är det onsdag.", - "4": "Idag är det torsdag.", - "5": "Idag är det fredag.", - "6": "Idag är det lördag.", - "7": "Idag är det söndag." + "#2": "Var inte rädd för att fråga och fråga tills du får svar: https://dbwebb.se/f/6249", + "#3": "Öva dig ställa smarta frågor: https://dbwebb.se/f/7802", + "#4": "When in doubt - gör ett testprogram. https://dbwebb.se/f/13570", + "#5": "Hey Luke - use the source! https://catb.org/jargon/html/U/UTSL.html" }, "video-of-today": { - "1": "https://www.youtube.com/watch?v=HbJ6Jsy0JfY https://www.youtube.com/watch?v=-Kobdb37Cwc eller https://www.youtube.com/watch?v=d-diB65scQU", - "2": "https://www.youtube.com/watch?v=sL4znuvCuRg", - "3": "https://www.youtube.com/watch?v=F3jnymeJof4", - "4": "https://www.youtube.com/watch?v=9Tg_zvDg3Xo", - "5": "https://www.youtube.com/watch?v=kfVsfOSbJY0", - "6": "https://www.youtube.com/watch?v=GVCzdpagXOQ", - "7": "https://www.youtube.com/watch?v=c3BvW56tjB0" + "Monday": { + "url": "https://www.youtube.com/watch?v=HbJ6Jsy0JfY https://www.youtube.com/watch?v=-Kobdb37Cwc eller https://www.youtube.com/watch?v=d-diB65scQU", + "message": "Idag är det måndag." + }, + "Tuesday": { + "url": "https://www.youtube.com/watch?v=sL4znuvCuRg", + "message": "Idag är det tisdag." + }, + "Wednesday": { + "url": "https://www.youtube.com/watch?v=F3jnymeJof4", + "message": "Idag är det onsdag." + }, + "Thursday": { + "url": "https://www.youtube.com/watch?v=9Tg_zvDg3Xo", + "message": "Idag är det torsdag." + }, + "Friday": { + "url": "https://www.youtube.com/watch?v=kfVsfOSbJY0", + "message": "Idag är det fredag." + }, + "Saturday": { + "url": "https://www.youtube.com/watch?v=GVCzdpagXOQ", + "message": "Idag är det lördag." + }, + "Sunday": { + "url": "https://www.youtube.com/watch?v=c3BvW56tjB0", + "message": "Idag är det söndag." + } }, - "lunch-message": [ - "Ska vi ta {}?", - "Jag är lite sugen på {}?", - "Jag tänkte käka på {}, ska du med?", - "{}, där är det mysigt, ska vi ta där?" - ], - - "lunch-karlskrona": [ - "Olles krovbar", - "Lila thai stället", - "donken", - "tex mex stället vid subway", - "Subway", - "Nya peking", - "kebab house", - "Royal thai", - "thai stället vid hemmakväll", - "Gelato", - "Indian garden", - "Sumo sushi", - "Pasterian i stan", - "Biobaren", - "Michelangelo" - ], - - "lunch-bth": [ - "thairestaurangen vid korsningen", - "fiket jämte demolabbet", - "Indiska", - "Pappa curry", - "boden uppe på parkeringen", - "Bergåsa kebab", - "Pasterian", - "Villa Oscar", - "Eat here", - "Bistro J" - ], - - "lunch-angelholm": [ - "Kirris", - "Passagen", - "Ica (mmmm broccoli)", - "Åkanten (Om sommar och sol)", - "Top Falafel", - "Subway", - "Acapulco", - "Kebab på torget", - "Ostbutiken", - "Hummerhuset", - "Klitterhus (fancy stuff)" - ], - - "lunch-hassleholm": [ - "pastavagnen på torget", - "Freds", - "mcDonalds", - "subway", - "kinabuffé på Cats", - "valentino", - "lotterilådan", - "casablance", - "det där stället i gallerian", - "infinity", - "östervärn", - "argentina", - "T4" - ], - - "lunch-malmo": [ - "afrikanskt på Calabass (http://www.calabass.com/)", - "mexikanskt på Zócalo (http://zocalo.se/restaurangerna/malmo/)", - "hamburgare på Surf Shack (http://surfshacksmashburgers.com/)", - "hamburgare på Casual Street Food (http://www.casualstreetfood.se/)", - "hamburgare på Tommi's (http://www.tommisburgerjoint.se/)", - "kebab på Döner Kebab (http://www.triangeln.com/doner_kebab)" - ], - - "lunch-goteborg": [ - "halvspecial på Preem", - "grillat på Odinsgrillen (http://www.odinsparkgrill.se/)", - "hamburgare på Burgersson Frigga (http://www.burgersson.se/)", - "hamburgare på Tugg (http://gbg.tuggburgers.se/)", - "japanskt på Mikado (http://www.mikadogoteborg.se/)", - "pizza på I love pizza (http://www.ilovepizza.se/)", - "burrito på TomToms Burritos (http://www.tomtoms.se/)", - "steak på Brasa (http://www.restaurangbrasa.se/)", - "något fint på Post-hotellet (http://www.nordabargrill.se/lunch/)", - "något på John Scott's Place (http://johnscotts.se/palace/)", - "husman på Vällagat (http://www.vallagat.se/)", - "husman på AtWork (http://atwork.nu/restaurang/)", - "sallad på MiXiT (http://mixitgbg.se/mixit-garda/)" - ], + "lunch": { + "message" : [ + "Ska vi ta {}?", + "Jag är lite sugen på {}?", + "Jag tänkte käka på {}, ska du med?", + "{}, där är det mysigt, ska vi ta där?" + ], + "location": { + "karlskrona": [ + "Olles krovbar", + "Lila thai stället", + "donken", + "tex mex stället vid subway", + "Subway", + "Nya peking", + "kebab house", + "Royal thai", + "thai stället vid hemmakväll", + "Gelato", + "Indian garden", + "Sumo sushi", + "Pasterian i stan", + "Biobaren", + "Michelangelo" + ], + "bth": [ + "thairestaurangen vid korsningen", + "fiket jämte demolabbet", + "Indiska", + "Pappa curry", + "boden uppe på parkeringen", + "Bergåsa kebab", + "Pasterian", + "Villa Oscar", + "Eat here", + "Bistro J" + ], + "angelholm": [ + "Kirris", + "Passagen", + "Ica (mmmm broccoli)", + "Åkanten (Om sommar och sol)", + "Top Falafel", + "Subway", + "Acapulco", + "Kebab på torget", + "Ostbutiken", + "Hummerhuset", + "Klitterhus (fancy stuff)" + ], + "hassleholm": [ + "pastavagnen på torget", + "Freds", + "mcDonalds", + "subway", + "kinabuffé på Cats", + "valentino", + "lotterilådan", + "casablance", + "det där stället i gallerian", + "infinity", + "östervärn", + "argentina", + "T4" + ], + "malmo": [ + "afrikanskt på Calabass (https://www.calabass.com/)", + "mexikanskt på Zócalo (https://zocalo.se/restaurangerna/malmo/)", + "hamburgare på Surf Shack (https://surfshacksmashburgers.com/)", + "hamburgare på Casual Street Food (https://www.casualstreetfood.se/)", + "hamburgare på Tommi's (https://www.tommisburgerjoint.se/)", + "kebab på Döner Kebab (https://www.triangeln.com/doner_kebab)" + ], + "goteborg": [ + "halvspecial på Preem", + "grillat på Odinsgrillen (https://www.odinsparkgrill.se/)", + "hamburgare på Burgersson Frigga (https://www.burgersson.se/)", + "hamburgare på Tugg (https://gbg.tuggburgers.se/)", + "japanskt på Mikado (https://www.mikadogoteborg.se/)", + "pizza på I love pizza (https://www.ilovepizza.se/)", + "burrito på TomToms Burritos (https://www.tomtoms.se/)", + "steak på Brasa (https://www.restaurangbrasa.se/)", + "något fint på Post-hotellet (https://www.nordabargrill.se/lunch/)", + "något på John Scott's Place (https://johnscotts.se/palace/)", + "husman på Vällagat (https://www.vallagat.se/)", + "husman på AtWork (https://atwork.nu/restaurang/)", + "sallad på MiXiT (https://mixitgbg.se/mixit-garda/)" + ] + } + }, "sun": { "url": "https://api.sunrisesunset.io/json?lat=56.182244&lng=15.5882305", @@ -189,9 +195,9 @@ }, "commitstrip": { - "message": "Ta en paus och hämta energi med dagens comic strip från commitStrip: {url}, kolla lite gifs på http://thecodinglove.com/, läs dagens artikel på http://thedailywtf.com/ och slösurfa https://www.reddit.com/r/programmerhumor", - "url": "http://www.commitstrip.com/en/", - "urlPage": "http://www.commitstrip.com/en/page/", + "message": "Ta en paus och hämta energi med dagens comic strip från commitStrip: {url}, kolla lite gifs på https://thecodinglove.com/, läs dagens artikel på https://thedailywtf.com/ och slösurfa https://www.reddit.com/r/programmerhumor", + "url": "https://www.commitstrip.com/en/", + "urlPage": "https://www.commitstrip.com/en/page/", "first": 1, "last": 688 }, @@ -220,7 +226,7 @@ }, "birthday": { - "url": "http://dbwebb.se/forum/", + "url": "https://dbwebb.se/forum/", "somebody": "Idag gratulerar vi {}", "nobody": "Ingen som fyller år idag.", "error": "Något gick snett, jag har inte en susning om någon fyller år eller inte." @@ -231,7 +237,7 @@ "error": "Något gick snett, jag har inte en susning om någon har namnsdag idag eller inte." }, "uptime": { - "info": "Kolla in statsen för uptime-tävlingen på http://uptime.dbwebb.se/" + "info": "Kolla in statsen för uptime-tävlingen på https://uptime.dbwebb.se/" }, "stream": { "info": "Streamen finns på https://dbwebb.se/stream och sparas i spellistan 'Streamade föreläsningar/seminarier' https://www.youtube.com/playlist?list=PLKtP9l5q3ce8Bhxn22oBYWZZ4-3ms1rMl" @@ -256,7 +262,7 @@ "error": "Chuck Norris har inte tid underhålla er idag!" }, "commit": { - "url": "http://whatthecommit.com/index.txt", + "url": "https://whatthecommit.com/index.txt", "error": "Du får komma på ett själv. Jag är trasig för tillfället!" } } diff --git a/test_marvin_actions.py b/test_marvin_actions.py index 8475623..8624dab 100644 --- a/test_marvin_actions.py +++ b/test_marvin_actions.py @@ -6,8 +6,9 @@ """ import json +import os -from datetime import date +from datetime import date, timedelta from unittest import mock, TestCase import requests @@ -63,17 +64,16 @@ def assertBBQResponse(self, todaysDate, bbqDate, expectedMessageKey): if expectedMessageKey in ["base", "week", "eternity"]: message = message % bbqDate - with mock.patch("marvin_actions.datetime") as d: + with mock.patch("marvin_actions.datetime") as d, mock.patch("marvin_actions.random") as r: d.date.today.return_value = todaysDate - with mock.patch("marvin_actions.random") as r: - r.randint.return_value = 1 - expected = f"{url}. {message}" - self.assertActionOutput(marvin_actions.marvinTimeToBBQ, "dags att grilla", expected) + r.randint.return_value = 1 + expected = f"{url}. {message}" + self.assertActionOutput(marvin_actions.marvinTimeToBBQ, "dags att grilla", expected) def assertNameDayOutput(self, exampleFile, expectedOutput): """Assert that the proper nameday message is returned, given an inputfile""" - with open(f"namedayFiles/{exampleFile}.json", "r", encoding="UTF-8") as f: + with open(os.path.join("namedayFiles", f"{exampleFile}.json"), "r", encoding="UTF-8") as f: response = requests.models.Response() response._content = str.encode(json.dumps(json.load(f))) with mock.patch("marvin_actions.requests") as r: @@ -82,7 +82,7 @@ def assertNameDayOutput(self, exampleFile, expectedOutput): def assertJokeOutput(self, exampleFile, expectedOutput): """Assert that a joke is returned, given an input file""" - with open(f"jokeFiles/{exampleFile}.json", "r", encoding="UTF-8") as f: + with open(os.path.join("jokeFiles", f"{exampleFile}.json"), "r", encoding="UTF-8") as f: response = requests.models.Response() response._content = str.encode(json.dumps(json.load(f))) with mock.patch("marvin_actions.requests") as r: @@ -91,7 +91,7 @@ def assertJokeOutput(self, exampleFile, expectedOutput): def assertSunOutput(self, expectedOutput): """Test that marvin knows when the sun comes up, given an input file""" - with open("sunFiles/sun.json", "r", encoding="UTF-8") as f: + with open(os.path.join("sunFiles", "sun.json"), "r", encoding="UTF-8") as f: response = requests.models.Response() response._content = str.encode(json.dumps(json.load(f))) with mock.patch("marvin_actions.requests") as r: @@ -127,7 +127,7 @@ def testGoogle(self): def testExplainShell(self): """Test that marvin can explain shell commands""" - url = "http://explainshell.com/explain?cmd=pwd" + url = "https://explainshell.com/explain?cmd=pwd" self.assertActionOutput(marvin_actions.marvinExplainShell, "explain pwd", url) self.assertActionOutput(marvin_actions.marvinExplainShell, "can you explain pwd", url) self.assertActionOutput( @@ -168,10 +168,12 @@ def testVideoOfToday(self): """Test that marvin can link to a different video each day of the week""" with mock.patch("marvin_actions.datetime") as dt: for d in range(1, 8): - dt.date.weekday.return_value = d - 1 - day = self.strings.get("weekdays").get(str(d)) - video = self.strings.get("video-of-today").get(str(d)) - response = f"{day} En passande video är {video}" + day = date(2024, 11, 25) + timedelta(days=d) + dt.date.today.return_value = day + weekday = day.strftime("%A") + weekdayPhrase = self.strings.get("video-of-today").get(weekday).get("message") + videoPhrase = self.strings.get("video-of-today").get(weekday).get("url") + response = f"{weekdayPhrase} En passande video är {videoPhrase}" self.assertActionOutput(marvin_actions.marvinVideoOfToday, "dagens video", response) self.assertActionSilent(marvin_actions.marvinVideoOfToday, "videoidag") @@ -180,11 +182,6 @@ def testHelp(self): self.assertStringsOutput(marvin_actions.marvinHelp, "help", "menu") self.assertActionSilent(marvin_actions.marvinHelp, "halp") - def testStats(self): - """Test that marvin can provide a link to the IRC stats page""" - self.assertStringsOutput(marvin_actions.marvinStats, "stats", "ircstats") - self.assertActionSilent(marvin_actions.marvinStats, "statistics") - def testSayHi(self): """Test that marvin responds to greetings""" with mock.patch("marvin_actions.random") as r: @@ -200,8 +197,8 @@ def testLunchLocations(self): locations = ["karlskrona", "goteborg", "angelholm", "hassleholm", "malmo"] with mock.patch("marvin_actions.random") as r: for location in locations: - for index, place in enumerate(self.strings.get(f"lunch-{location}")): - r.randint.side_effect = [0, index] + for i, place in enumerate(self.strings.get("lunch").get("location").get(location)): + r.randint.side_effect = [0, i] self.assertActionOutput( marvin_actions.marvinLunch, f"mat {location}", f"Ska vi ta {place}?") r.randint.side_effect = [1, 2] @@ -243,11 +240,10 @@ def testNameDayReaction(self): def testNameDayRequest(self): """Test that marvin sends a proper request for nameday info""" - with mock.patch("marvin_actions.requests") as r: - with mock.patch("marvin_actions.datetime") as d: - d.datetime.now.return_value = date(2024, 1, 2) - self.executeAction(marvin_actions.marvinNameday, "namnsdag") - self.assertEqual(r.get.call_args.args[0], "http://api.dryg.net/dagar/v2.1/2024/1/2") + with mock.patch("marvin_actions.requests") as r, mock.patch("marvin_actions.datetime") as d: + d.datetime.now.return_value = date(2024, 1, 2) + self.executeAction(marvin_actions.marvinNameday, "namnsdag") + self.assertEqual(r.get.call_args.args[0], "https://api.dryg.net/dagar/v2.1/2024/1/2") def testNameDayResponse(self): """Test that marvin properly parses nameday responses""" @@ -315,7 +311,7 @@ def testCommitRequest(self): """Test that marvin sends proper requests when generating commit messages""" with mock.patch("marvin_actions.requests") as r: self.executeAction(marvin_actions.marvinCommit, "vad skriver man efter commit -m?") - self.assertEqual(r.get.call_args.args[0], "http://whatthecommit.com/index.txt") + self.assertEqual(r.get.call_args.args[0], "https://whatthecommit.com/index.txt") def testCommitResponse(self): """Test that marvin properly handles responses when generating commit messages"""