From 961c25be78a1fa8ca78f8460813efc0bd2d179d3 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 09:47:12 -0400 Subject: [PATCH 01/29] new .search start --- sopel_modules/SpiceBot/Google.py | 2 ++ .../SpiceBot_Core_Commands/Commands.py | 2 ++ .../SpiceBot_Core_Commands/Search.py | 26 +++++++++++++++++++ .../SpiceBot_Core_Commands/__init__.py | 1 + 4 files changed, 31 insertions(+) create mode 100644 sopel_modules/SpiceBot_Core_Commands/Search.py diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 8d29968..c1ffffe 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -5,6 +5,8 @@ from __future__ import unicode_literals, absolute_import, division, print_functi import requests from fake_useragent import UserAgent +# TODO add a cache flush + class Google(): diff --git a/sopel_modules/SpiceBot_Core_Commands/Commands.py b/sopel_modules/SpiceBot_Core_Commands/Commands.py index 3353ea1..8a1feef 100644 --- a/sopel_modules/SpiceBot_Core_Commands/Commands.py +++ b/sopel_modules/SpiceBot_Core_Commands/Commands.py @@ -11,6 +11,8 @@ import spicemanip import sopel_modules.SpiceBot as SpiceBot +# TODO commands sent in privmsg don't need bot.nick + @SpiceBot.events.check_ready([SpiceBot.events.BOT_COMMANDS]) @SpiceBot.prerun.prerun('nickname') diff --git a/sopel_modules/SpiceBot_Core_Commands/Search.py b/sopel_modules/SpiceBot_Core_Commands/Search.py new file mode 100644 index 0000000..0e9dfc6 --- /dev/null +++ b/sopel_modules/SpiceBot_Core_Commands/Search.py @@ -0,0 +1,26 @@ +# coding=utf8 +from __future__ import unicode_literals, absolute_import, division, print_function +""" +This is the SpiceBot search system. +""" +import sopel + +import spicemanip + +import sopel_modules.SpiceBot as SpiceBot + + +@SpiceBot.prerun.prerun('module') +@sopel.module.commands('search', 'find', 'google', 'lookup') +def nickname_comand_commands(bot, trigger): + + searchterm = spicemanip.main(trigger.sb['args'], 0) or None + if not searchterm: + bot.osd("Not sure what you want me to look for.") + return + + searchreturn = SpiceBot.google.search(searchterm) + if not searchreturn: + bot.osd('I cannot find anything about that') + else: + bot.osd(["[Information search for '" + str(searchterm) + "']", str(searchreturn)]) diff --git a/sopel_modules/SpiceBot_Core_Commands/__init__.py b/sopel_modules/SpiceBot_Core_Commands/__init__.py index e4a8f3c..4f14aee 100644 --- a/sopel_modules/SpiceBot_Core_Commands/__init__.py +++ b/sopel_modules/SpiceBot_Core_Commands/__init__.py @@ -16,6 +16,7 @@ from .Runtime_Controls import * from .Messaging import * from .Docs import * from .BotPrivs import * +from .Search import * __author__ = 'Sam Zick' __email__ = 'sam@deathbybandaid.net' From a4a564a5fd58942609d0a292094347c67d016723 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:16:15 -0400 Subject: [PATCH 02/29] test googlesearch api --- requirements.txt | 1 + sopel_modules/SpiceBot/Google.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/requirements.txt b/requirements.txt index d131efd..527ca95 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ spicemanip>=0.1.6 gitpython pygit2 fake-useragent +googlesearch diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index c1ffffe..ec4725f 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -5,6 +5,8 @@ from __future__ import unicode_literals, absolute_import, division, print_functi import requests from fake_useragent import UserAgent +import googlesearch + # TODO add a cache flush @@ -21,6 +23,12 @@ class Google(): # losercase searching searchterm = searchterm.lower() + """ + safe='off', + """ + + return str(googlesearch.lucky(searchterm):) + # check cache if searchtype not in list(self.cache.keys()): self.cache[searchtype] = dict() @@ -34,6 +42,8 @@ class Google(): if searchtype == 'maps': var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) elif searchtype == 'info': + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) + elif searchtype == 'youtube': var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) else: var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) From 771ba1606d6e31015491125a2c0b271a3a77092d Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:18:15 -0400 Subject: [PATCH 03/29] colobn --- sopel_modules/SpiceBot/Google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index ec4725f..c8f6b80 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -27,7 +27,7 @@ class Google(): safe='off', """ - return str(googlesearch.lucky(searchterm):) + return str(googlesearch.lucky(searchterm)) # check cache if searchtype not in list(self.cache.keys()): From 2346b10654fe4044256ae783918cf4d4e0d65239 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:21:49 -0400 Subject: [PATCH 04/29] reqs --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 527ca95..f44e4f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ spicemanip>=0.1.6 gitpython pygit2 fake-useragent -googlesearch +google +google-search From 7a0a9bed2c121179db1594874de7de31a6690504 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:24:03 -0400 Subject: [PATCH 05/29] test --- sopel_modules/SpiceBot/Google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index c8f6b80..2fa6c14 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -27,7 +27,7 @@ class Google(): safe='off', """ - return str(googlesearch.lucky(searchterm)) + return str(googlesearch.search(searchterm)) # check cache if searchtype not in list(self.cache.keys()): From 720bae35cfe684a9c3d7797129ee36e2cdf0853b Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:25:45 -0400 Subject: [PATCH 06/29] test --- sopel_modules/SpiceBot/Google.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 2fa6c14..cf8e5b5 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals, absolute_import, division, print_functi import requests from fake_useragent import UserAgent -import googlesearch +from googlesearch import search as gsearch # TODO add a cache flush @@ -27,7 +27,7 @@ class Google(): safe='off', """ - return str(googlesearch.search(searchterm)) + return str(gsearch(searchterm)) # check cache if searchtype not in list(self.cache.keys()): From 1ab64fec54e195aa241de48e0ef1e69fe2118e90 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:26:14 -0400 Subject: [PATCH 07/29] test --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f44e4f5..24ed472 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,3 @@ gitpython pygit2 fake-useragent google -google-search From 822a9c82621f9c898d7f951f1f81d9ddba9d9b66 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:28:34 -0400 Subject: [PATCH 08/29] test --- sopel_modules/SpiceBot/Google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index cf8e5b5..1cdd078 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals, absolute_import, division, print_functi import requests from fake_useragent import UserAgent -from googlesearch import search as gsearch +from google import search as gsearch # TODO add a cache flush From 132cdda94a6b0dc4acaf9e1b9a90c47aecd2cd3a Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:35:05 -0400 Subject: [PATCH 09/29] google search --- sopel_modules/SpiceBot/Google.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 1cdd078..5607df1 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -5,8 +5,6 @@ from __future__ import unicode_literals, absolute_import, division, print_functi import requests from fake_useragent import UserAgent -from google import search as gsearch - # TODO add a cache flush @@ -27,8 +25,6 @@ class Google(): safe='off', """ - return str(gsearch(searchterm)) - # check cache if searchtype not in list(self.cache.keys()): self.cache[searchtype] = dict() @@ -42,9 +38,12 @@ class Google(): if searchtype == 'maps': var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) elif searchtype == 'info': - var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) + url = "http://www.google.com" + query = {'q': searchterm} + var = requests.get(url, params=query) + # var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) elif searchtype == 'youtube': - var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) else: var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) except Exception as e: From a66cbdb377f7c54e608dec9012b73d007af964e6 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:43:27 -0400 Subject: [PATCH 10/29] test --- sopel_modules/SpiceBot/Google.py | 18 ++++--- .../SpiceBot_Core_Commands/Search.py | 50 ++++++++++++++++++- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 5607df1..5f5a7db 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -35,17 +35,19 @@ class Google(): data = searchterm.replace(' ', '+') lookfor = data.replace(':', '%3A') try: + if searchtype == 'info': + url = "http://www.google.com" + elif searchtype == 'maps': + url = "http://www.google.com" + elif searchtype == 'youtube': + url = "https://www.youtube.com" + else: + url = "http://www.google.com" + query = {'q': searchterm} if searchtype == 'maps': var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) - elif searchtype == 'info': - url = "http://www.google.com" - query = {'q': searchterm} - var = requests.get(url, params=query) - # var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) - elif searchtype == 'youtube': - var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) else: - var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) + var = requests.get(url, params=query) except Exception as e: var = e var = None diff --git a/sopel_modules/SpiceBot_Core_Commands/Search.py b/sopel_modules/SpiceBot_Core_Commands/Search.py index 0e9dfc6..9f2f622 100644 --- a/sopel_modules/SpiceBot_Core_Commands/Search.py +++ b/sopel_modules/SpiceBot_Core_Commands/Search.py @@ -12,7 +12,7 @@ import sopel_modules.SpiceBot as SpiceBot @SpiceBot.prerun.prerun('module') @sopel.module.commands('search', 'find', 'google', 'lookup') -def nickname_comand_commands(bot, trigger): +def search_main(bot, trigger): searchterm = spicemanip.main(trigger.sb['args'], 0) or None if not searchterm: @@ -24,3 +24,51 @@ def nickname_comand_commands(bot, trigger): bot.osd('I cannot find anything about that') else: bot.osd(["[Information search for '" + str(searchterm) + "']", str(searchreturn)]) + + +@SpiceBot.prerun.prerun('module') +@sopel.module.commands("where", "whereis") +def search_where(bot, trigger): + + searchterm = spicemanip.main(trigger.sb['args'], 0) or None + if not searchterm: + bot.osd("Not sure what you want me to look for.") + return + + searchreturn = SpiceBot.google.search(searchterm, 'maps') + if not searchreturn: + bot.osd('I cannot find anything about that') + else: + bot.osd(["[Location search for " + str(searchterm) + "]", str(searchreturn)]) + + +@SpiceBot.prerun.prerun('module') +@sopel.module.commands("what", "whatis") +def search_what(bot, trigger): + + searchterm = spicemanip.main(trigger.sb['args'], 0) or None + if not searchterm: + bot.osd("Not sure what you want me to look for.") + return + + searchreturn = SpiceBot.google.search(searchterm) + if not searchreturn: + bot.osd('I cannot find anything about that') + else: + bot.osd(["[Information search for '" + str(searchterm) + "']", str(searchreturn)]) + + +@SpiceBot.prerun.prerun('module') +@sopel.module.commands("youtube", "video") +def search_video(bot, trigger): + + searchterm = spicemanip.main(trigger.sb['args'], 0) or None + if not searchterm: + bot.osd("Not sure what you want me to look for.") + return + + searchreturn = SpiceBot.google.search(searchterm, 'youtube') + if not searchreturn: + bot.osd('I cannot find anything about that') + else: + bot.osd(["[Youtube search for '" + str(searchterm) + "']", str(searchreturn)]) From cb45a2a305232407cabe8efaef11c6e477fef91b Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:53:36 -0400 Subject: [PATCH 11/29] test --- sopel_modules/SpiceBot/Google.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 5f5a7db..e16145a 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -36,18 +36,13 @@ class Google(): lookfor = data.replace(':', '%3A') try: if searchtype == 'info': - url = "http://www.google.com" + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) elif searchtype == 'maps': - url = "http://www.google.com" - elif searchtype == 'youtube': - url = "https://www.youtube.com" - else: - url = "http://www.google.com" - query = {'q': searchterm} - if searchtype == 'maps': var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) + elif searchtype == 'youtube': + var = requests.get(r'http://www.google.com/search_query?q=' + lookfor + '&btnI', headers=header) else: - var = requests.get(url, params=query) + var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) except Exception as e: var = e var = None From d99e96386f0ef0b3294f7b260682e189322ad570 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 10:55:36 -0400 Subject: [PATCH 12/29] youtube --- sopel_modules/SpiceBot/Google.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index e16145a..f6353e7 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -36,11 +36,11 @@ class Google(): lookfor = data.replace(':', '%3A') try: if searchtype == 'info': - var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) + var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) elif searchtype == 'maps': var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) elif searchtype == 'youtube': - var = requests.get(r'http://www.google.com/search_query?q=' + lookfor + '&btnI', headers=header) + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) else: var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) except Exception as e: From bb33c328af55ad31cd05425fd7c2635bb945eae4 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 11:52:26 -0400 Subject: [PATCH 13/29] test --- sopel_modules/SpiceBot/Google.py | 82 +++++++++++++++++++++++------ sopel_modules/SpiceBot/configure.py | 8 +++ sopel_modules/SpiceBot/setup.py | 9 ++++ 3 files changed, 83 insertions(+), 16 deletions(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index f6353e7..53846de 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -2,20 +2,33 @@ from __future__ import unicode_literals, absolute_import, division, print_function """A way to search google""" +import urllib import requests from fake_useragent import UserAgent +from sopel.config.types import StaticSection, ValidatedAttribute + +from .Config import config as botconfig + # TODO add a cache flush +class SpiceBot_Google_MainSection(StaticSection): + search_api = ValidatedAttribute('search_api', default=None) + + class Google(): def __init__(self): + self.setup_google() self.cache = { "info": {}, "maps": {} } + def setup_commands(self): + botconfig.define_section("SpiceBot_Google", SpiceBot_Google_MainSection, validate=False) + def search(self, searchterm, searchtype="info"): # losercase searching @@ -31,27 +44,64 @@ class Google(): if searchterm in self.cache[searchtype]: return self.cache[searchtype][searchterm] + if searchtype == 'maps': + returnurl = self.search_maps(searchterm) + elif searchtype == 'youtube': + returnurl = self.search_youtube(searchterm) + else: + returnurl = self.search_info(self, searchterm) + + if returnurl: + self.cache[searchtype][searchterm] = str(returnurl) + return returnurl + + def search_info(self, searchterm, retry=False): header = {'User-Agent': str(UserAgent().chrome)} data = searchterm.replace(' ', '+') lookfor = data.replace(':', '%3A') - try: - if searchtype == 'info': + if not botconfig.SpiceBot_Google.search_api or retry: + try: var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) - elif searchtype == 'maps': - var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) - elif searchtype == 'youtube': - var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) - else: - var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) - except Exception as e: - var = e - var = None - - if not var or not var.url: - return None - else: - self.cache[searchtype][searchterm] = str(var.url) + except Exception as e: + var = e + var = None + if not var or not var.url: + return None return var.url + else: + return self.search_info(searchterm, retry=True) + + def search_maps(self, searchterm, retry=False): + header = {'User-Agent': str(UserAgent().chrome)} + data = searchterm.replace(' ', '+') + lookfor = data.replace(':', '%3A') + if not botconfig.SpiceBot_Google.search_api or retry: + try: + var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) + except Exception as e: + var = e + var = None + if not var or not var.url: + return None + return var.url + else: + return self.search_maps(searchterm, retry=True) + + def search_youtube(self, searchterm, retry=False): + header = {'User-Agent': str(UserAgent().chrome)} + data = searchterm.replace(' ', '+') + lookfor = data.replace(':', '%3A') + if not botconfig.SpiceBot_Google.search_api or retry: + try: + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) + except Exception as e: + var = e + var = None + if not var or not var.url: + return None + return var.url + else: + return self.search_youtube(searchterm, retry=True) google = Google() diff --git a/sopel_modules/SpiceBot/configure.py b/sopel_modules/SpiceBot/configure.py index 6469d17..f67627a 100644 --- a/sopel_modules/SpiceBot/configure.py +++ b/sopel_modules/SpiceBot/configure.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals, absolute_import, division, print_functi """Configuration for SpiceBot""" from .Channels import SpiceBot_Channels_MainSection +from .Commands import SpiceBot_Commands_MainSection +from .Google import SpiceBot_Google_MainSection from .AI import SpiceBot_AI_MainSection from .Update import SpiceBot_Update_MainSection from .Kick import SpiceBot_Kick @@ -36,3 +38,9 @@ def configure(config): config.define_section("SpiceBot_AI", SpiceBot_AI_MainSection, validate=False) config.SpiceBot_AI.configure_setting('extra', 'extra aiml directories to import matches from') config.SpiceBot_AI.configure_setting('gender', 'bot gender') + + config.define_section("SpiceBot_Commands", SpiceBot_Commands_MainSection, validate=False) + config.SpiceBot_Commands.configure_setting('query_prefix', 'query prefix') + + config.define_section("SpiceBot_Google", SpiceBot_Google_MainSection, validate=False) + config.SpiceBot_Google.configure_setting('search_api', 'api key for google searching') diff --git a/sopel_modules/SpiceBot/setup.py b/sopel_modules/SpiceBot/setup.py index f830ee1..ac91e04 100644 --- a/sopel_modules/SpiceBot/setup.py +++ b/sopel_modules/SpiceBot/setup.py @@ -13,6 +13,7 @@ from .Events import events from .Channels import SpiceBot_Channels_MainSection from .Commands import SpiceBot_Commands_MainSection +from .Google import SpiceBot_Google_MainSection from .Update import SpiceBot_Update_MainSection from .osd import SopelWrapperOSD, ToolsOSD, SopelOSD, SpiceBot_OSD from .Kick import SopelWrapperKICK, SopelKICK, SpiceBot_Kick @@ -30,6 +31,9 @@ def setup(bot): # Commands setup_commands(bot) + # Commands + setup_google(bot) + # OSD setup_osd(bot) @@ -75,6 +79,11 @@ def setup_commands(bot): bot.config.core.prefix_list.extend(bot.config.SpiceBot_Commands.query_prefix) +def setup_google(bot): + logs.log('SpiceBot_Google', "Setting Up Configuration") + bot.config.define_section("SpiceBot_Google", SpiceBot_Google_MainSection, validate=False) + + def setup_startupmonologue(bot): logs.log('SpiceBot_StartupMonologue', "Initial Setup processing") events.startup_add([ From 88fddb720c8d71bb52c36d89aee8d7bbd39ce413 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 11:52:59 -0400 Subject: [PATCH 14/29] repair --- sopel_modules/SpiceBot/Google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 53846de..229e1a7 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -49,7 +49,7 @@ class Google(): elif searchtype == 'youtube': returnurl = self.search_youtube(searchterm) else: - returnurl = self.search_info(self, searchterm) + returnurl = self.search_info(searchterm) if returnurl: self.cache[searchtype][searchterm] = str(returnurl) From 9e25b89819c4ae042c58c81c4804b73c5d98a62c Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 11:53:59 -0400 Subject: [PATCH 15/29] fix --- sopel_modules/SpiceBot/Google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 229e1a7..0af6881 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -26,7 +26,7 @@ class Google(): "maps": {} } - def setup_commands(self): + def setup_google(self): botconfig.define_section("SpiceBot_Google", SpiceBot_Google_MainSection, validate=False) def search(self, searchterm, searchtype="info"): From 56afb75ffcdb66d278095f72cfd07616c8cec449 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 11:57:17 -0400 Subject: [PATCH 16/29] update --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 24ed472..29a04fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ spicemanip>=0.1.6 gitpython pygit2 fake-useragent -google +google-api-python-client From 3849d372f1d02afe4e2fba84c5c5343ab322a516 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 14 Jun 2019 13:15:48 -0400 Subject: [PATCH 17/29] update google --- sopel_modules/SpiceBot/Google.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index 0af6881..d9e9047 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals, absolute_import, division, print_function """A way to search google""" -import urllib import requests from fake_useragent import UserAgent From 1e2098ceb84e6878d0543686e49e8f06c75a39ef Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 09:12:36 -0400 Subject: [PATCH 18/29] move AI to core commands --- sopel_modules/SpiceBot_AI/__init__.py | 8 -------- .../{SpiceBot_AI => SpiceBot_Core_Commands}/AI.py | 2 +- sopel_modules/SpiceBot_Core_Commands/__init__.py | 1 + 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 sopel_modules/SpiceBot_AI/__init__.py rename sopel_modules/{SpiceBot_AI => SpiceBot_Core_Commands}/AI.py (99%) diff --git a/sopel_modules/SpiceBot_AI/__init__.py b/sopel_modules/SpiceBot_AI/__init__.py deleted file mode 100644 index b1447b6..0000000 --- a/sopel_modules/SpiceBot_AI/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# coding=utf8 -from __future__ import unicode_literals, absolute_import, division, print_function - -from .AI import * - -__author__ = 'Sam Zick' -__email__ = 'sam@deathbybandaid.net' -__version__ = '0.1.1' diff --git a/sopel_modules/SpiceBot_AI/AI.py b/sopel_modules/SpiceBot_Core_Commands/AI.py similarity index 99% rename from sopel_modules/SpiceBot_AI/AI.py rename to sopel_modules/SpiceBot_Core_Commands/AI.py index 88fedb0..5c13fb7 100644 --- a/sopel_modules/SpiceBot_AI/AI.py +++ b/sopel_modules/SpiceBot_Core_Commands/AI.py @@ -10,7 +10,7 @@ import spicemanip @sopel.module.rule('(.*)') -def bot_command_rule(bot, trigger): +def bot_command_rule_ai(bot, trigger): # TODO add config limits # but still allow in privmsg diff --git a/sopel_modules/SpiceBot_Core_Commands/__init__.py b/sopel_modules/SpiceBot_Core_Commands/__init__.py index 4f14aee..836f544 100644 --- a/sopel_modules/SpiceBot_Core_Commands/__init__.py +++ b/sopel_modules/SpiceBot_Core_Commands/__init__.py @@ -17,6 +17,7 @@ from .Messaging import * from .Docs import * from .BotPrivs import * from .Search import * +from .AI import * __author__ = 'Sam Zick' __email__ = 'sam@deathbybandaid.net' From 383ee1a26b88695f0f98c021b5f9456bb06f2159 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:22:30 -0400 Subject: [PATCH 19/29] first test of gif class system --- MANIFEST.in | 3 +- sopel_modules/SpiceBot/Gif.py | 233 ++++++++++++++++ sopel_modules/SpiceBot/Google.py | 10 +- sopel_modules/SpiceBot/__init__.py | 1 + sopel_modules/SpiceBot/configure.py | 5 + sopel_modules/SpiceBot/setup.py | 7 + .../gifapi/gfycat | 0 .../gifapi/gifme | 0 .../gifapi/giphy | 0 .../gifapi/tenor | 0 sopel_modules/SpiceBot_Core_Commands/Gif.py | 51 ++++ .../SpiceBot_Core_Commands/__init__.py | 1 + .../SpiceBot_GifSearch/Gif_API_Commands.py | 33 --- .../SpiceBot_GifSearch/Gif_Command.py | 31 --- .../SpiceBot_GifSearch/Gif_Search_Commands | 33 --- sopel_modules/SpiceBot_GifSearch/__init__.py | 15 -- sopel_modules/SpiceBot_GifSearch/gifsearch.py | 254 ------------------ 17 files changed, 303 insertions(+), 374 deletions(-) create mode 100644 sopel_modules/SpiceBot/Gif.py rename sopel_modules/{SpiceBot_GifSearch => SpiceBot_Configs}/gifapi/gfycat (100%) rename sopel_modules/{SpiceBot_GifSearch => SpiceBot_Configs}/gifapi/gifme (100%) rename sopel_modules/{SpiceBot_GifSearch => SpiceBot_Configs}/gifapi/giphy (100%) rename sopel_modules/{SpiceBot_GifSearch => SpiceBot_Configs}/gifapi/tenor (100%) create mode 100644 sopel_modules/SpiceBot_Core_Commands/Gif.py delete mode 100644 sopel_modules/SpiceBot_GifSearch/Gif_API_Commands.py delete mode 100644 sopel_modules/SpiceBot_GifSearch/Gif_Command.py delete mode 100644 sopel_modules/SpiceBot_GifSearch/Gif_Search_Commands delete mode 100644 sopel_modules/SpiceBot_GifSearch/__init__.py delete mode 100644 sopel_modules/SpiceBot_GifSearch/gifsearch.py diff --git a/MANIFEST.in b/MANIFEST.in index bddc36d..ac4d111 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -6,5 +6,4 @@ include *requirements.txt recursive-include tests * recursive-exclude * __pycache__ recursive-exclude * *.py[co] -recursive-include sopel_modules/SpiceBot_GifSearch/gifapi * -recursive-include sopel_modules/SpiceBot_Configs/aiml * +recursive-include sopel_modules/SpiceBot_Configs/* * diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py new file mode 100644 index 0000000..8c6a336 --- /dev/null +++ b/sopel_modules/SpiceBot/Gif.py @@ -0,0 +1,233 @@ +# coding=utf8 +from __future__ import unicode_literals, absolute_import, division, print_function +"""How to handle gifs""" + +from sopel.config.types import StaticSection, ValidatedAttribute +import sopel_modules + +from .Config import config as botconfig +from .Tools import read_directory_json_to_dict +from .Commands import config as botcommands + +import spicemanip + +import os +from fake_useragent import UserAgent +import urllib +import random +import requests +import json + + +class SpiceBot_Gif_MainSection(StaticSection): + extra = ValidatedAttribute('extra', default=None) + nsfw = ValidatedAttribute('nsfw', default=False) + + +class GifAPISection(StaticSection): + apikey = ValidatedAttribute('apikey', default=None) + + +class BotGif(): + + def __init__(self): + self.setup_gif() + self.badlinks = [] + self.header = {'User-Agent': str(UserAgent().chrome)} + self.valid_api = {} + + dir_to_scan = [] + for plugin_dir in set(sopel_modules.__path__): + configsdir = os.path.join(plugin_dir, "SpiceBot_Configs") + gifcfgdir = os.path.join(configsdir, "gifapi") + dir_to_scan.append(gifcfgdir) + + if len(botconfig.SopelGifSearch.extra): + for extragifcfgdir in botconfig.SopelGifSearch.extra: + dir_to_scan.append(extragifcfgdir) + + valid_gif_api_dict = read_directory_json_to_dict(dir_to_scan, "Gif API", "SpiceBot_Gif") + + for gif_api in list(valid_gif_api_dict.keys()): + botconfig.define_section(gif_api, GifAPISection, validate=False) + gif_api_config = eval("botconfig." + gif_api) + gif_api_config.configure_setting('apikey', 'GIF API Client ID-' + gif_api) + + self.valid_api[gif_api] = valid_gif_api_dict[gif_api] + self.valid_api[gif_api]["apikey"] = None + self.valid_api[gif_api]["cache"] = dict() + + apikey = eval("botconfig." + gif_api + ".apikey") + if apikey: + self.valid_api[gif_api]["apikey"] = apikey + + for validgifapi in list(self.valid_api.keys()): + command_dict = { + "comtype": "gif_prefix", + "validcoms": validgifapi + } + botcommands.dict['counts'] += 1 + botcommands.register(command_dict) + + def setup_gif(self): + botconfig.define_section("SopelGifSearch", SpiceBot_Gif_MainSection, validate=False) + + def get_gif(self, searchdict): + + # list of defaults + query_defaults = { + "query": None, + "searchnum": 'random', + "gifsearch": list(self.valid_api.keys()), + "gifsearchremove": ['gifme'], # TODO make a config setting + "searchlimit": 'default', + "nsfw": False, + } + + # set defaults if they don't exist + for key in query_defaults: + if key not in list(searchdict.keys()): + searchdict[key] = query_defaults[key] + if key == "gifsearch": + for remx in query_defaults["gifsearchremove"]: + searchdict["gifsearch"].remove(remx) + + if botconfig.SopelGifSearch.nsfw: + query_defaults["nsfw"] = True + + # verify query is there to search + if not searchdict["query"]: + return {"error": 'No Query to Search'} + + # Replace spaces in search query + searchdict["searchquery"] = urllib.request.pathname2url(searchdict["query"]) + + # set api usage + if not isinstance(searchdict['gifsearch'], list): + if str(searchdict['gifsearch']) in list(self.valid_api.keys()): + searchdict['gifsearch'] = [searchdict['gifsearch']] + else: + searchdict['gifsearch'] = list(self.valid_api.keys()) + for apis in searchdict['gifsearch']: + if apis not in list(self.valid_api.keys()): + searchdict['gifsearch'].remove(apis) + + # Verify search limit + if searchdict['searchlimit'] == 'default' or not isinstance(searchdict['searchlimit'], int): + searchdict['searchlimit'] = 50 + + # Random handling for searchnum + if searchdict["searchnum"] == 'random': + searchdict["searchnum"] = random.randint(0, searchdict['searchlimit']) + + # verify valid search parameters + if not str(searchdict["searchnum"]).isdigit(): + return {"error": 'No Search Number or Random Specified'} + + # perform search + gifapiresults = [] + for currentapi in searchdict['gifsearch']: + + # check if query is already cached + if searchdict["searchquery"].lower() in list(self.valid_api[currentapi]["cache"].keys()): + verifygoodlinks = [] + for gifresult in self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])]: + if gifresult["returnurl"] not in self.badlinks: + verifygoodlinks.append(gifresult) + self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])] = verifygoodlinks + else: + # assemble url + url = self.gif_url_assemble(currentapi, str(searchdict["searchquery"]), str(searchdict["searchlimit"]), searchdict['nsfw']) + # fetch results + self.fetch_gif_results(currentapi, str(searchdict["searchquery"]), url) + + if len(self.valid_api[currentapi]["cache"][searchdict["searchquery"].lower()]): + gifapiresults.extend(self.valid_api[currentapi]["cache"][searchdict["searchquery"].lower()]) + + if not len(gifapiresults): + return {"error": "No Results were found for '" + searchdict["query"] + "' in the " + str(spicemanip.main(searchdict['gifsearch'], 'orlist')) + " api(s)"} + + random.shuffle(gifapiresults) + random.shuffle(gifapiresults) + randombad = True + while randombad: + gifdict = spicemanip.main(gifapiresults, "random") + + try: + gifpage = requests.get(gifdict["returnurl"], headers=None) + except Exception as e: + gifpage = str(e) + gifpage = None + + if gifpage and not str(gifpage.status_code).startswith(tuple(["4", "5"])): + randombad = False + else: + self.badlinks.append(str(gifdict["returnurl"])) + newlist = [] + for tempdict in gifapiresults: + if tempdict["returnurl"] != gifdict["returnurl"]: + newlist.append(tempdict) + gifapiresults = newlist + + if not len(gifapiresults): + return {"error": "No Results were found for '" + searchdict["query"] + "' in the " + str(spicemanip.main(searchdict['gifsearch'], 'orlist')) + " api(s)"} + + # return dict + gifdict['error'] = None + return gifdict + + def fetch_gif_results(self, currentapi, searchquery, url): + try: + page = requests.get(url, headers=self.header) + except Exception as e: + page = e + page = None + if page and not str(page.status_code).startswith(tuple(["4", "5"])): + data = json.loads(urllib.request.urlopen(url).read().decode('utf-8')) + results = data[self.valid_api[currentapi]['results']] + resultsarray = [] + for result in results: + appendresult = False + cururl = result[self.valid_api[currentapi]['cururl']] + slashsplit = str(cururl).split("/") + fileextension = slashsplit[-1] + if not fileextension or fileextension == '': + appendresult = True + elif str(fileextension).endswith(".gif"): + appendresult = True + elif "." not in str(fileextension): + appendresult = True + if appendresult: + resultsarray.append(cururl) + # make sure there are results + if len(resultsarray): + # Create Temp dict for every result + tempresultnum = 0 + for tempresult in resultsarray: + if tempresult not in self.badlinks: + tempresultnum += 1 + tempdict = { + "returnnum": tempresultnum, + "returnurl": tempresult, + "gifapi": currentapi, + } + self.valid_api[currentapi]["cache"][str(searchquery).lower()].append(tempdict) + + def gif_url_assemble(self, currentapi, searchquery, searchlimit, searchnsfw): + # url base + url = str(self.valid_api[currentapi]['url']) + # query + url += str(self.valid_api[currentapi]['query']) + str(searchquery) + # limit + url += str(self.valid_api[currentapi]['limit']) + str(searchlimit) + # nsfw search? + if searchnsfw: + url += str(self.valid_api[currentapi]['nsfw']) + else: + url += str(self.valid_api[currentapi]['sfw']) + # api key + url += str(self.valid_api[currentapi]['key']) + str(self.valid_api[currentapi]['apikey']) + return url + + +gif = BotGif() diff --git a/sopel_modules/SpiceBot/Google.py b/sopel_modules/SpiceBot/Google.py index d9e9047..2afb29b 100644 --- a/sopel_modules/SpiceBot/Google.py +++ b/sopel_modules/SpiceBot/Google.py @@ -19,6 +19,7 @@ class SpiceBot_Google_MainSection(StaticSection): class Google(): def __init__(self): + self.header = {'User-Agent': str(UserAgent().chrome)} self.setup_google() self.cache = { "info": {}, @@ -55,12 +56,11 @@ class Google(): return returnurl def search_info(self, searchterm, retry=False): - header = {'User-Agent': str(UserAgent().chrome)} data = searchterm.replace(' ', '+') lookfor = data.replace(':', '%3A') if not botconfig.SpiceBot_Google.search_api or retry: try: - var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=header) + var = requests.get(r'http://www.google.com/search?q=' + lookfor + '&btnI', headers=self.header) except Exception as e: var = e var = None @@ -71,12 +71,11 @@ class Google(): return self.search_info(searchterm, retry=True) def search_maps(self, searchterm, retry=False): - header = {'User-Agent': str(UserAgent().chrome)} data = searchterm.replace(' ', '+') lookfor = data.replace(':', '%3A') if not botconfig.SpiceBot_Google.search_api or retry: try: - var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=header) + var = requests.get(r'http://www.google.com/maps/place/' + lookfor, headers=self.header) except Exception as e: var = e var = None @@ -87,12 +86,11 @@ class Google(): return self.search_maps(searchterm, retry=True) def search_youtube(self, searchterm, retry=False): - header = {'User-Agent': str(UserAgent().chrome)} data = searchterm.replace(' ', '+') lookfor = data.replace(':', '%3A') if not botconfig.SpiceBot_Google.search_api or retry: try: - var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=header) + var = requests.get(r'https://www.youtube.com/search?q=' + lookfor + '&btnI', headers=self.header) except Exception as e: var = e var = None diff --git a/sopel_modules/SpiceBot/__init__.py b/sopel_modules/SpiceBot/__init__.py index bc0397a..e5e8ccd 100644 --- a/sopel_modules/SpiceBot/__init__.py +++ b/sopel_modules/SpiceBot/__init__.py @@ -23,6 +23,7 @@ from .Channels import * from .Users import * from .AI import * from .Google import * +from .Gif import * from .configure import * diff --git a/sopel_modules/SpiceBot/configure.py b/sopel_modules/SpiceBot/configure.py index f67627a..d666b58 100644 --- a/sopel_modules/SpiceBot/configure.py +++ b/sopel_modules/SpiceBot/configure.py @@ -7,6 +7,7 @@ from .Commands import SpiceBot_Commands_MainSection from .Google import SpiceBot_Google_MainSection from .AI import SpiceBot_AI_MainSection from .Update import SpiceBot_Update_MainSection +from .Gif import SpiceBot_Gif_MainSection from .Kick import SpiceBot_Kick from .osd import SpiceBot_OSD @@ -44,3 +45,7 @@ def configure(config): config.define_section("SpiceBot_Google", SpiceBot_Google_MainSection, validate=False) config.SpiceBot_Google.configure_setting('search_api', 'api key for google searching') + + config.define_section("SpiceBot_Gif", SpiceBot_Gif_MainSection, validate=False) + config.SopelGifSearch.configure_setting('extra', 'SpiceBot_Gif API Extra directory') + config.SopelGifSearch.configure_setting('nsfw', 'SpiceBot_Gif API nsfw content') diff --git a/sopel_modules/SpiceBot/setup.py b/sopel_modules/SpiceBot/setup.py index ac91e04..e440b4d 100644 --- a/sopel_modules/SpiceBot/setup.py +++ b/sopel_modules/SpiceBot/setup.py @@ -17,6 +17,7 @@ from .Google import SpiceBot_Google_MainSection from .Update import SpiceBot_Update_MainSection from .osd import SopelWrapperOSD, ToolsOSD, SopelOSD, SpiceBot_OSD from .Kick import SopelWrapperKICK, SopelKICK, SpiceBot_Kick +from .Gif import SpiceBot_Gif_MainSection from .AI import SpiceBot_AI_MainSection @@ -52,6 +53,8 @@ def setup(bot): # startupmonologue setup_startupmonologue(bot) + setup_gif(bot) + def setup_config(bot): logs.log('SpiceBot_Config', "Setting Up Configuration") @@ -138,3 +141,7 @@ def setup_kick(bot): logs.log('SpiceBot_Kick', "Checking for config settings") bot.config.define_section("SpiceBot_Kick", SpiceBot_Kick, validate=False) botconfig.define_section("SpiceBot_Kick", SpiceBot_Kick, validate=False) + + +def setup_gif(bot): + bot.config.define_section("SopelGifSearch", SpiceBot_Gif_MainSection, validate=False) diff --git a/sopel_modules/SpiceBot_GifSearch/gifapi/gfycat b/sopel_modules/SpiceBot_Configs/gifapi/gfycat similarity index 100% rename from sopel_modules/SpiceBot_GifSearch/gifapi/gfycat rename to sopel_modules/SpiceBot_Configs/gifapi/gfycat diff --git a/sopel_modules/SpiceBot_GifSearch/gifapi/gifme b/sopel_modules/SpiceBot_Configs/gifapi/gifme similarity index 100% rename from sopel_modules/SpiceBot_GifSearch/gifapi/gifme rename to sopel_modules/SpiceBot_Configs/gifapi/gifme diff --git a/sopel_modules/SpiceBot_GifSearch/gifapi/giphy b/sopel_modules/SpiceBot_Configs/gifapi/giphy similarity index 100% rename from sopel_modules/SpiceBot_GifSearch/gifapi/giphy rename to sopel_modules/SpiceBot_Configs/gifapi/giphy diff --git a/sopel_modules/SpiceBot_GifSearch/gifapi/tenor b/sopel_modules/SpiceBot_Configs/gifapi/tenor similarity index 100% rename from sopel_modules/SpiceBot_GifSearch/gifapi/tenor rename to sopel_modules/SpiceBot_Configs/gifapi/tenor diff --git a/sopel_modules/SpiceBot_Core_Commands/Gif.py b/sopel_modules/SpiceBot_Core_Commands/Gif.py new file mode 100644 index 0000000..755822c --- /dev/null +++ b/sopel_modules/SpiceBot_Core_Commands/Gif.py @@ -0,0 +1,51 @@ +# coding=utf-8 + +from __future__ import unicode_literals, absolute_import, division, print_function + +import sopel.module + +import sopel_modules.SpiceBot as SpiceBot + +import spicemanip + +# TODO custom gif shortcut commands + + +@SpiceBot.prerun.prerun('gif_prefix') +@sopel.module.commands('gif') +def gif_trigger(bot, trigger): + + if not len(trigger.sb['args']): + return bot.osd("Please present a query to search.") + + query = spicemanip.main(trigger.sb['args'], 0) + searchapis = list(SpiceBot.gif.valid_api.keys()) + searchdict = {"query": query, "gifsearch": searchapis} + + gifdict = SpiceBot.gif.get_gif(searchdict) + + if gifdict["error"]: + bot.osd(gifdict["error"]) + else: + bot.osd(str(gifdict['gifapi'].title() + " Result (" + str(query) + " #" + str(gifdict["returnnum"]) + "): " + str(gifdict["returnurl"]))) + + +@SpiceBot.prerun.prerun('gif_prefix') +@sopel.module.commands('(.*)') +def gifapi_triggers(bot, trigger): + + if trigger.sb['com'] not in list(SpiceBot.gif.valid_api.keys()): + return + + if not len(trigger.sb['args']): + return bot.osd("Please present a query to search.") + + query = spicemanip.main(trigger.sb['args'], 0) + searchdict = {"query": query, "gifsearch": trigger.sb['com']} + + gifdict = SpiceBot.gif.get_gif(searchdict) + + if gifdict["error"]: + bot.osd(gifdict["error"]) + else: + bot.osd(str(gifdict['gifapi'].title() + " Result (" + str(query) + " #" + str(gifdict["returnnum"]) + "): " + str(gifdict["returnurl"]))) diff --git a/sopel_modules/SpiceBot_Core_Commands/__init__.py b/sopel_modules/SpiceBot_Core_Commands/__init__.py index 836f544..a451704 100644 --- a/sopel_modules/SpiceBot_Core_Commands/__init__.py +++ b/sopel_modules/SpiceBot_Core_Commands/__init__.py @@ -18,6 +18,7 @@ from .Docs import * from .BotPrivs import * from .Search import * from .AI import * +from .Gif import * __author__ = 'Sam Zick' __email__ = 'sam@deathbybandaid.net' diff --git a/sopel_modules/SpiceBot_GifSearch/Gif_API_Commands.py b/sopel_modules/SpiceBot_GifSearch/Gif_API_Commands.py deleted file mode 100644 index 6a76425..0000000 --- a/sopel_modules/SpiceBot_GifSearch/Gif_API_Commands.py +++ /dev/null @@ -1,33 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals, absolute_import, division, print_function - -from .gifsearch import getGif - -import sopel.module - -import spicemanip - -import sopel_modules.SpiceBot as SpiceBot - - -@SpiceBot.events.check_ready([SpiceBot.events.BOT_GIFSEARCH]) -@SpiceBot.prerun.prerun('prefix') -@sopel.module.commands('(.*)') -def gifapi_triggers(bot, trigger): - - if trigger.sb['com'] not in list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()): - return - - if not len(trigger.sb['args']): - return bot.osd("Please present a query to search.") - - query = spicemanip.main(trigger.sb['args'], 0) - searchdict = {"query": query, "gifsearch": trigger.sb['com']} - - gifdict = getGif(bot, searchdict) - - if gifdict["error"]: - bot.osd(gifdict["error"]) - else: - bot.osd(str(gifdict['gifapi'].title() + " Result (" + str(query) + " #" + str(gifdict["returnnum"]) + "): " + str(gifdict["returnurl"]))) diff --git a/sopel_modules/SpiceBot_GifSearch/Gif_Command.py b/sopel_modules/SpiceBot_GifSearch/Gif_Command.py deleted file mode 100644 index 631a8d1..0000000 --- a/sopel_modules/SpiceBot_GifSearch/Gif_Command.py +++ /dev/null @@ -1,31 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals, absolute_import, division, print_function - -from sopel import module - -from .gifsearch import getGif - -import sopel_modules.SpiceBot as SpiceBot - -import spicemanip - - -@SpiceBot.events.check_ready([SpiceBot.events.BOT_GIFSEARCH]) -@SpiceBot.prerun.prerun('prefix') -@module.commands('gif') -def gif_trigger(bot, trigger): - - if not len(trigger.sb['args']): - return bot.osd("Please present a query to search.") - - query = spicemanip.main(trigger.sb['args'], 0) - searchapis = list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()) - searchdict = {"query": query, "gifsearch": searchapis} - - gifdict = getGif(bot, searchdict) - - if gifdict["error"]: - bot.osd(gifdict["error"]) - else: - bot.osd(str(gifdict['gifapi'].title() + " Result (" + str(query) + " #" + str(gifdict["returnnum"]) + "): " + str(gifdict["returnurl"]))) diff --git a/sopel_modules/SpiceBot_GifSearch/Gif_Search_Commands b/sopel_modules/SpiceBot_GifSearch/Gif_Search_Commands deleted file mode 100644 index 6a76425..0000000 --- a/sopel_modules/SpiceBot_GifSearch/Gif_Search_Commands +++ /dev/null @@ -1,33 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals, absolute_import, division, print_function - -from .gifsearch import getGif - -import sopel.module - -import spicemanip - -import sopel_modules.SpiceBot as SpiceBot - - -@SpiceBot.events.check_ready([SpiceBot.events.BOT_GIFSEARCH]) -@SpiceBot.prerun.prerun('prefix') -@sopel.module.commands('(.*)') -def gifapi_triggers(bot, trigger): - - if trigger.sb['com'] not in list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()): - return - - if not len(trigger.sb['args']): - return bot.osd("Please present a query to search.") - - query = spicemanip.main(trigger.sb['args'], 0) - searchdict = {"query": query, "gifsearch": trigger.sb['com']} - - gifdict = getGif(bot, searchdict) - - if gifdict["error"]: - bot.osd(gifdict["error"]) - else: - bot.osd(str(gifdict['gifapi'].title() + " Result (" + str(query) + " #" + str(gifdict["returnnum"]) + "): " + str(gifdict["returnurl"]))) diff --git a/sopel_modules/SpiceBot_GifSearch/__init__.py b/sopel_modules/SpiceBot_GifSearch/__init__.py deleted file mode 100644 index c91a38a..0000000 --- a/sopel_modules/SpiceBot_GifSearch/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# coding=utf8 -"""Sopel Gif Search - -Sopel Gif Search builds a convenient framework for searching for Gifs -""" -from __future__ import unicode_literals, absolute_import, division, print_function - -from .Gif_Command import * -from .Gif_API_Commands import * -# from .Gif_Search_Commands import * -from .gifsearch import * - -__author__ = 'Sam Zick' -__email__ = 'sam@deathbybandaid.net' -__version__ = '0.1.1' diff --git a/sopel_modules/SpiceBot_GifSearch/gifsearch.py b/sopel_modules/SpiceBot_GifSearch/gifsearch.py deleted file mode 100644 index d7122ab..0000000 --- a/sopel_modules/SpiceBot_GifSearch/gifsearch.py +++ /dev/null @@ -1,254 +0,0 @@ -# coding=utf-8 - -from __future__ import unicode_literals, absolute_import, division, print_function - -import sopel.module -from sopel.config.types import StaticSection, ValidatedAttribute - -import sopel_modules.SpiceBot as SpiceBot - -import spicemanip - -import os -import urllib -import requests -import json -from fake_useragent import UserAgent -import random - - -class GifAPIMainSection(StaticSection): - extra = ValidatedAttribute('extra', default=None) - nsfw = ValidatedAttribute('nsfw', default=False) - - -class GifAPISection(StaticSection): - apikey = ValidatedAttribute('apikey', default=None) - - -def configure(config): - moduledir = os.path.dirname(os.path.abspath(__file__)) - api_dir = os.path.join(moduledir, 'gifapi') - valid_gif_api_dict = SpiceBot.read_directory_json_to_dict([api_dir], "Gif API", "SpiceBot_GifSearch", logging=True) - - config.define_section("SopelGifSearch", GifAPIMainSection, validate=False) - config.SopelGifSearch.configure_setting('extra', 'SpiceBot_GifSearch API Extra directory') - config.SopelGifSearch.configure_setting('nsfw', 'SpiceBot_GifSearch API nsfw content') - - for gif_api in list(valid_gif_api_dict.keys()): - config.define_section(gif_api, GifAPISection, validate=False) - gif_api_config = eval("config." + gif_api) - gif_api_config.configure_setting('apikey', 'GIF API Client ID-' + gif_api) - - -def setup(bot): - SpiceBot.logs.log('SpiceBot_GifSearch', "Starting Setup Procedure") - SpiceBot.events.startup_add([SpiceBot.events.BOT_GIFSEARCH]) - - if 'SpiceBot_GifSearch' not in bot.memory: - bot.memory["SpiceBot_GifSearch"] = {"cache": {}, "badgiflinks": [], 'valid_gif_api_dict': {}} - - dir_to_scan = [] - - moduledir = os.path.dirname(os.path.abspath(__file__)) - api_dir = os.path.join(moduledir, 'gifapi') - dir_to_scan.append(api_dir) - - bot.config.define_section("SopelGifSearch", GifAPIMainSection, validate=False) - SpiceBot.config.define_section("SopelGifSearch", GifAPIMainSection, validate=False) - if bot.config.SopelGifSearch.extra: - dir_to_scan.append(bot.config.SopelGifSearch.extra) - - valid_gif_api_dict = SpiceBot.read_directory_json_to_dict(dir_to_scan, "Gif API", "SpiceBot_GifSearch", logging=True) - - for gif_api in list(valid_gif_api_dict.keys()): - bot.config.define_section(gif_api, GifAPISection, validate=False) - SpiceBot.config.define_section(gif_api, GifAPISection, validate=False) - apikey = eval("bot.config." + gif_api + ".apikey") - if apikey: - valid_gif_api_dict[gif_api]["apikey"] = apikey - else: - valid_gif_api_dict[gif_api]["apikey"] = None - bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][gif_api] = valid_gif_api_dict[gif_api] - - for validgifapi in list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()): - command_dict = { - "comtype": "prefix", - "validcoms": validgifapi - } - SpiceBot.commands.dict['counts'] += 1 - SpiceBot.commands.register(command_dict) - - if validgifapi not in bot.memory["SpiceBot_GifSearch"]['cache'].keys(): - bot.memory["SpiceBot_GifSearch"]['cache'][validgifapi] = dict() - - SpiceBot.events.trigger(bot, SpiceBot.events.BOT_GIFSEARCH, "SpiceBot_GifSearch") - - -def shutdown(bot): - if "SpiceBot_GifSearch" in bot.memory: - del bot.memory["SpiceBot_GifSearch"] - - -def getGif(bot, searchdict): - - header = {'User-Agent': str(UserAgent().chrome)} - - # list of defaults - query_defaults = { - "query": None, - "searchnum": 'random', - "gifsearch": list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()), - "gifsearchremove": ['gifme'], - "searchlimit": 'default', - "nsfw": False, - } - - if bot.config.SopelGifSearch.nsfw: - query_defaults["nsfw"] = True - - # set defaults if they don't exist - for key in query_defaults: - if key not in list(searchdict.keys()): - searchdict[key] = query_defaults[key] - if key == "gifsearch": - for remx in query_defaults["gifsearchremove"]: - searchdict["gifsearch"].remove(remx) - - # Replace spaces in search query - if not searchdict["query"]: - return {"error": 'No Query to Search'} - # searchdict["searchquery"] = searchdict["query"].replace(' ', '%20') - searchdict["searchquery"] = urllib.request.pathname2url(searchdict["query"]) - - # set api usage - if not isinstance(searchdict['gifsearch'], list): - if str(searchdict['gifsearch']) in list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()): - searchdict['gifsearch'] = [searchdict['gifsearch']] - else: - searchdict['gifsearch'] = bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys() - else: - for apis in searchdict['gifsearch']: - if apis not in list(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'].keys()): - searchdict['gifsearch'].remove(apis) - - # Verify search limit - if searchdict['searchlimit'] == 'default' or not isinstance(searchdict['searchlimit'], int): - searchdict['searchlimit'] = 50 - - # Random handling for searchnum - if searchdict["searchnum"] == 'random': - searchdict["searchnum"] = random.randint(0, searchdict['searchlimit']) - - # Make sure there is a valid input of query and search number - if not searchdict["query"]: - return {"error": 'No Query to Search'} - - if not str(searchdict["searchnum"]).isdigit(): - return {"error": 'No Search Number or Random Specified'} - - gifapiresults = [] - for currentapi in searchdict['gifsearch']: - - # url base - url = str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['url']) - # query - url += str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['query']) + str(searchdict["searchquery"]) - # limit - url += str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['limit']) + str(searchdict["searchlimit"]) - # nsfw search? - if searchdict['nsfw']: - url += str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['nsfw']) - else: - url += str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['sfw']) - # api key - url += str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['key']) + str(bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['apikey']) - - if currentapi not in list(bot.memory["SpiceBot_GifSearch"]['cache'].keys()): - bot.memory["SpiceBot_GifSearch"]['cache'][currentapi] = dict() - - if str(searchdict["searchquery"]) not in list(bot.memory["SpiceBot_GifSearch"]['cache'][currentapi].keys()): - bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])] = [] - - if not len(bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])]): - - try: - page = requests.get(url, headers=header) - except Exception as e: - page = None - - if page and not str(page.status_code).startswith(tuple(["4", "5"])): - - data = json.loads(urllib.request.urlopen(url).read().decode('utf-8')) - - results = data[bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['results']] - resultsarray = [] - for result in results: - appendresult = False - cururl = result[bot.memory["SpiceBot_GifSearch"]['valid_gif_api_dict'][currentapi]['cururl']] - slashsplit = str(cururl).split("/") - fileextension = slashsplit[-1] - if not fileextension or fileextension == '': - appendresult = True - elif str(fileextension).endswith(".gif"): - appendresult = True - elif "." not in str(fileextension): - appendresult = True - if appendresult: - resultsarray.append(cururl) - - # make sure there are results - if len(resultsarray): - - # Create Temp dict for every result - tempresultnum = 0 - for tempresult in resultsarray: - if tempresult not in bot.memory["SpiceBot_GifSearch"]["badgiflinks"]: - tempresultnum += 1 - tempdict = dict() - tempdict["returnnum"] = tempresultnum - tempdict["returnurl"] = tempresult - tempdict["gifapi"] = currentapi - bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])].append(tempdict) - - else: - verifygoodlinks = [] - for gifresult in bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])]: - if gifresult["returnurl"] not in bot.memory["SpiceBot_GifSearch"]["badgiflinks"]: - verifygoodlinks.append(gifresult) - bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])] = verifygoodlinks - - if len(bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])]): - gifapiresults.extend(bot.memory["SpiceBot_GifSearch"]['cache'][currentapi][str(searchdict["searchquery"])]) - - if not len(gifapiresults): - return {"error": "No Results were found for '" + searchdict["query"] + "' in the " + str(spicemanip.main(searchdict['gifsearch'], 'orlist')) + " api(s)"} - - random.shuffle(gifapiresults) - random.shuffle(gifapiresults) - randombad = True - while randombad: - gifdict = spicemanip.main(gifapiresults, "random") - - try: - gifpage = requests.get(gifdict["returnurl"], headers=None) - except Exception as e: - gifpage = str(e) - gifpage = None - - if gifpage and not str(gifpage.status_code).startswith(tuple(["4", "5"])): - randombad = False - else: - bot.memory["SpiceBot_GifSearch"]["badgiflinks"].append(str(gifdict["returnurl"])) - newlist = [] - for tempdict in gifapiresults: - if tempdict["returnurl"] != gifdict["returnurl"]: - newlist.append(tempdict) - gifapiresults = newlist - - if not len(gifapiresults): - return {"error": "No Results were found for '" + searchdict["query"] + "' in the " + str(spicemanip.main(searchdict['gifsearch'], 'orlist')) + " api(s)"} - - # return dict - gifdict['error'] = None - return gifdict From 15e9124185d2a8cb750488b5a2add39f7d92a008 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:25:22 -0400 Subject: [PATCH 20/29] fix mistake --- sopel_modules/SpiceBot/Gif.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index 8c6a336..70ccb77 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -7,7 +7,7 @@ import sopel_modules from .Config import config as botconfig from .Tools import read_directory_json_to_dict -from .Commands import config as botcommands +from .Commands import commands as botcommands import spicemanip From a7b3f35d2a9a18a3cc8d26c14464c7ce2ffd86e8 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:26:42 -0400 Subject: [PATCH 21/29] ListAttribute --- sopel_modules/SpiceBot/Gif.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index 70ccb77..2d9fd84 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals, absolute_import, division, print_function """How to handle gifs""" -from sopel.config.types import StaticSection, ValidatedAttribute +from sopel.config.types import StaticSection, ValidatedAttribute, ListAttribute import sopel_modules from .Config import config as botconfig @@ -20,7 +20,7 @@ import json class SpiceBot_Gif_MainSection(StaticSection): - extra = ValidatedAttribute('extra', default=None) + extra = ListAttribute('extra', default=None) nsfw = ValidatedAttribute('nsfw', default=False) From d034f9d5c8990e390b9306930de89aec2a2ce258 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:26:59 -0400 Subject: [PATCH 22/29] hmm --- sopel_modules/SpiceBot/Gif.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index 2d9fd84..dcc56ac 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -20,7 +20,7 @@ import json class SpiceBot_Gif_MainSection(StaticSection): - extra = ListAttribute('extra', default=None) + extra = ListAttribute('extra') nsfw = ValidatedAttribute('nsfw', default=False) From 3f78546f47d40675c41d049ffd3a3c7d96e246f6 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:33:56 -0400 Subject: [PATCH 23/29] testy --- sopel_modules/SpiceBot/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/__init__.py b/sopel_modules/SpiceBot/__init__.py index e5e8ccd..95f8a55 100644 --- a/sopel_modules/SpiceBot/__init__.py +++ b/sopel_modules/SpiceBot/__init__.py @@ -23,7 +23,7 @@ from .Channels import * from .Users import * from .AI import * from .Google import * -from .Gif import * +# from .Gif import * from .configure import * From 57bbd483bf364e015668f991767929cfc604fd71 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:36:01 -0400 Subject: [PATCH 24/29] test --- .../SpiceBot_Configs/gifapi => Installation Files}/gfycat | 0 .../SpiceBot_Configs/gifapi => Installation Files}/gifme | 0 .../SpiceBot_Configs/gifapi => Installation Files}/giphy | 0 .../SpiceBot_Configs/gifapi => Installation Files}/tenor | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {sopel_modules/SpiceBot_Configs/gifapi => Installation Files}/gfycat (100%) rename {sopel_modules/SpiceBot_Configs/gifapi => Installation Files}/gifme (100%) rename {sopel_modules/SpiceBot_Configs/gifapi => Installation Files}/giphy (100%) rename {sopel_modules/SpiceBot_Configs/gifapi => Installation Files}/tenor (100%) diff --git a/sopel_modules/SpiceBot_Configs/gifapi/gfycat b/Installation Files/gfycat similarity index 100% rename from sopel_modules/SpiceBot_Configs/gifapi/gfycat rename to Installation Files/gfycat diff --git a/sopel_modules/SpiceBot_Configs/gifapi/gifme b/Installation Files/gifme similarity index 100% rename from sopel_modules/SpiceBot_Configs/gifapi/gifme rename to Installation Files/gifme diff --git a/sopel_modules/SpiceBot_Configs/gifapi/giphy b/Installation Files/giphy similarity index 100% rename from sopel_modules/SpiceBot_Configs/gifapi/giphy rename to Installation Files/giphy diff --git a/sopel_modules/SpiceBot_Configs/gifapi/tenor b/Installation Files/tenor similarity index 100% rename from sopel_modules/SpiceBot_Configs/gifapi/tenor rename to Installation Files/tenor From a75199c0c8997f861ff6e6490afd16b760f62ec6 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:40:44 -0400 Subject: [PATCH 25/29] fix setup --- sopel_modules/SpiceBot/Gif.py | 2 -- .../SpiceBot_Configs/gifapi}/gfycat | 0 .../SpiceBot_Configs/gifapi}/gifme | 0 .../SpiceBot_Configs/gifapi}/giphy | 0 .../SpiceBot_Configs/gifapi}/tenor | 0 5 files changed, 2 deletions(-) rename {Installation Files => sopel_modules/SpiceBot_Configs/gifapi}/gfycat (100%) rename {Installation Files => sopel_modules/SpiceBot_Configs/gifapi}/gifme (100%) rename {Installation Files => sopel_modules/SpiceBot_Configs/gifapi}/giphy (100%) rename {Installation Files => sopel_modules/SpiceBot_Configs/gifapi}/tenor (100%) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index dcc56ac..26304f2 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -50,8 +50,6 @@ class BotGif(): for gif_api in list(valid_gif_api_dict.keys()): botconfig.define_section(gif_api, GifAPISection, validate=False) - gif_api_config = eval("botconfig." + gif_api) - gif_api_config.configure_setting('apikey', 'GIF API Client ID-' + gif_api) self.valid_api[gif_api] = valid_gif_api_dict[gif_api] self.valid_api[gif_api]["apikey"] = None diff --git a/Installation Files/gfycat b/sopel_modules/SpiceBot_Configs/gifapi/gfycat similarity index 100% rename from Installation Files/gfycat rename to sopel_modules/SpiceBot_Configs/gifapi/gfycat diff --git a/Installation Files/gifme b/sopel_modules/SpiceBot_Configs/gifapi/gifme similarity index 100% rename from Installation Files/gifme rename to sopel_modules/SpiceBot_Configs/gifapi/gifme diff --git a/Installation Files/giphy b/sopel_modules/SpiceBot_Configs/gifapi/giphy similarity index 100% rename from Installation Files/giphy rename to sopel_modules/SpiceBot_Configs/gifapi/giphy diff --git a/Installation Files/tenor b/sopel_modules/SpiceBot_Configs/gifapi/tenor similarity index 100% rename from Installation Files/tenor rename to sopel_modules/SpiceBot_Configs/gifapi/tenor From 665d70a8a8986b55e751f9a66c1b79b358257df9 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:47:46 -0400 Subject: [PATCH 26/29] fix --- sopel_modules/SpiceBot/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/__init__.py b/sopel_modules/SpiceBot/__init__.py index 95f8a55..e5e8ccd 100644 --- a/sopel_modules/SpiceBot/__init__.py +++ b/sopel_modules/SpiceBot/__init__.py @@ -23,7 +23,7 @@ from .Channels import * from .Users import * from .AI import * from .Google import * -# from .Gif import * +from .Gif import * from .configure import * From ec45233c0229683e2e59599708addfebc92e2a87 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:50:03 -0400 Subject: [PATCH 27/29] new line logs --- sopel_modules/SpiceBot/Logs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Logs.py b/sopel_modules/SpiceBot/Logs.py index 45225b7..ac6fc15 100644 --- a/sopel_modules/SpiceBot/Logs.py +++ b/sopel_modules/SpiceBot/Logs.py @@ -48,7 +48,7 @@ class BotLogs(): self.dict["queue"].append(logmessage) if stdio: - self.botstderr(logmessage) + self.botstderr(logmessage + "\n") if logtype not in list(self.dict["list"].keys()): self.dict["list"][logtype] = [] From 5557daa7b694e34310e9a66fd4e641186abc34e8 Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:54:50 -0400 Subject: [PATCH 28/29] search if no len() --- sopel_modules/SpiceBot/Gif.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index 26304f2..220d99a 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -127,13 +127,14 @@ class BotGif(): for currentapi in searchdict['gifsearch']: # check if query is already cached - if searchdict["searchquery"].lower() in list(self.valid_api[currentapi]["cache"].keys()): + if searchdict["searchquery"].lower() in list(self.valid_api[currentapi]["cache"].keys()) or not len(self.valid_api[currentapi]["cache"][str(searchdict["searchquery"]).lower()]): verifygoodlinks = [] for gifresult in self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])]: if gifresult["returnurl"] not in self.badlinks: verifygoodlinks.append(gifresult) self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])] = verifygoodlinks else: + self.valid_api[currentapi]["cache"][str(searchdict["searchquery"]).lower()] = [] # assemble url url = self.gif_url_assemble(currentapi, str(searchdict["searchquery"]), str(searchdict["searchlimit"]), searchdict['nsfw']) # fetch results From fd3d468fcfd13d4eaab6bccd8ccaced200291f4a Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Mon, 17 Jun 2019 11:58:55 -0400 Subject: [PATCH 29/29] better logic for search --- sopel_modules/SpiceBot/Gif.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/sopel_modules/SpiceBot/Gif.py b/sopel_modules/SpiceBot/Gif.py index 220d99a..f39ac9c 100644 --- a/sopel_modules/SpiceBot/Gif.py +++ b/sopel_modules/SpiceBot/Gif.py @@ -127,13 +127,17 @@ class BotGif(): for currentapi in searchdict['gifsearch']: # check if query is already cached - if searchdict["searchquery"].lower() in list(self.valid_api[currentapi]["cache"].keys()) or not len(self.valid_api[currentapi]["cache"][str(searchdict["searchquery"]).lower()]): - verifygoodlinks = [] - for gifresult in self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])]: - if gifresult["returnurl"] not in self.badlinks: - verifygoodlinks.append(gifresult) - self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])] = verifygoodlinks - else: + searchfor = True + if searchdict["searchquery"].lower() in list(self.valid_api[currentapi]["cache"].keys()): + if len(self.valid_api[currentapi]["cache"][str(searchdict["searchquery"]).lower()]): + searchfor = False + verifygoodlinks = [] + for gifresult in self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])]: + if gifresult["returnurl"] not in self.badlinks: + verifygoodlinks.append(gifresult) + self.valid_api[currentapi]["cache"][str(searchdict["searchquery"])] = verifygoodlinks + + if searchfor: self.valid_api[currentapi]["cache"][str(searchdict["searchquery"]).lower()] = [] # assemble url url = self.gif_url_assemble(currentapi, str(searchdict["searchquery"]), str(searchdict["searchlimit"]), searchdict['nsfw'])