| @@ -20,6 +20,7 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from hashlib import sha256 | |||||
| from os.path import expanduser | from os.path import expanduser | ||||
| from threading import Lock | from threading import Lock | ||||
| @@ -42,8 +43,9 @@ class Task(BaseTask): | |||||
| cfg = config.tasks.get(self.name, {}) | cfg = config.tasks.get(self.name, {}) | ||||
| self.template = cfg.get("template", "AfC suspected copyvio") | self.template = cfg.get("template", "AfC suspected copyvio") | ||||
| self.ignore_list = cfg.get("ignoreList", []) | self.ignore_list = cfg.get("ignoreList", []) | ||||
| self.min_confidence = cfg.get("minConfidence", 0.75) | |||||
| self.min_confidence = cfg.get("minConfidence", 0.5) | |||||
| self.max_queries = cfg.get("maxQueries", 10) | self.max_queries = cfg.get("maxQueries", 10) | ||||
| self.cache_results = cfg.get("cacheResults", False) | |||||
| default_summary = "Tagging suspected [[WP:COPYVIO|copyright violation]] of {url}" | default_summary = "Tagging suspected [[WP:COPYVIO|copyright violation]] of {url}" | ||||
| self.summary = self.make_summary(cfg.get("summary", default_summary)) | self.summary = self.make_summary(cfg.get("summary", default_summary)) | ||||
| @@ -110,6 +112,8 @@ class Task(BaseTask): | |||||
| self.logger.debug(msg.format(url, confidence)) | self.logger.debug(msg.format(url, confidence)) | ||||
| self.log_processed(pageid) | self.log_processed(pageid) | ||||
| if self.cache_results: | |||||
| self.cache_result(page, result) | |||||
| def has_been_processed(self, pageid): | def has_been_processed(self, pageid): | ||||
| """Returns True if pageid was processed before, otherwise False.""" | """Returns True if pageid was processed before, otherwise False.""" | ||||
| @@ -129,3 +133,32 @@ class Task(BaseTask): | |||||
| query = "INSERT INTO processed VALUES (?)" | query = "INSERT INTO processed VALUES (?)" | ||||
| with self.conn.cursor() as cursor: | with self.conn.cursor() as cursor: | ||||
| cursor.execute(query, (pageid,)) | cursor.execute(query, (pageid,)) | ||||
| def cache_result(self, page, result): | |||||
| """Store the check's result in a cache table temporarily. | |||||
| The cache contains the page's ID, a hash of its content, the URL of the | |||||
| best match, the time of caching, and the number of queries used. It | |||||
| will replace any existing cache entries for that page. | |||||
| The cache is intended for EarwigBot's complementary Toolserver web | |||||
| interface, in which copyvio checks can be done separately from the bot. | |||||
| The cache saves time and money by saving the result of the web search | |||||
| but neither the result of the comparison nor any actual text (which | |||||
| could violate data retention policy). Cache entries are (intended to | |||||
| be) retained for one day; this task does not remove old entries (that | |||||
| is handled by the Toolserver component). | |||||
| This will only be called if "cache_results" == True in the task's, | |||||
| config, which is False by default. | |||||
| """ | |||||
| pageid = page.pageid() | |||||
| hash = sha256(page.get()).hexdigest() | |||||
| query1 = "SELECT 1 FROM cache WHERE cache_id = ?" | |||||
| query2 = "DELETE FROM cache WHERE cache_id = ?" | |||||
| query3 = "INSERT INTO cache VALUES (?, ?, ?, CURRENT_TIMESTAMP, ?, ?)" | |||||
| with self.conn.cursor() as cursor: | |||||
| cursor.execute(query1, (pageid,)) | |||||
| if cursor.fetchall(): | |||||
| cursor.execute(query2, (pageid,)) | |||||
| cursor.execute(query3, (pageid, hash, result.url, result.queries, 0)) | |||||