Skip to content

Commit

Permalink
Check last run time on new table before calling function again
Browse files Browse the repository at this point in the history
  • Loading branch information
iranzo committed Aug 5, 2017
1 parent aa8e067 commit 50467fe
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 45 deletions.
2 changes: 1 addition & 1 deletion stampy/plugin/comic.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def init():
triggers = ["^/comic"]

if botname == 'redken_bot':
triggers.append("^#cron")
stampy.stampy.cronme(name="comic", interval=30)

for comic in getcomics():
triggers.extend(["/%s" % comic])
Expand Down
42 changes: 10 additions & 32 deletions stampy/plugin/feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

import dateutil.parser
import feedparser
import pytz
from prettytable import from_db_cursor

import stampy.plugin.alias
Expand All @@ -32,7 +31,7 @@ def init():
triggers = ["^/feed"]

if botname == 'redken_bot':
triggers.append("^#cron")
stampy.stampy.cronme(name="feed", interval=5)

return triggers

Expand Down Expand Up @@ -214,7 +213,7 @@ def feeds(message=False, name=False):
"""
logger = logging.getLogger(__name__)

date = utize(datetime.datetime.now())
date = stampy.stampy.utize(datetime.datetime.now())

if message:
msgdetail = stampy.stampy.getmsgdetail(message)
Expand Down Expand Up @@ -258,17 +257,17 @@ def feeds(message=False, name=False):

try:
# Parse date or if in error, use past
datelast = utize(dateutil.parser.parse(lastchecked))
datelast = stampy.stampy.utize(dateutil.parser.parse(lastchecked))

except:
datelast = utize(datetime.datetime(year=1981, month=1, day=24))
datelast = stampy.stampy.utize(datetime.datetime(year=1981, month=1, day=24))

try:
# Parse date or if in error, use past
datelastitem = utize(dateutil.parser.parse(lastitem))
datelastitem = stampy.stampy.utize(dateutil.parser.parse(lastitem))

except:
datelastitem = utize(datetime.datetime(year=1981, month=1, day=24))
datelastitem = stampy.stampy.utize(datetime.datetime(year=1981, month=1, day=24))

# Get time since last check on the feed (epoch)
datelastts = time.mktime(datelast.timetuple())
Expand All @@ -290,17 +289,17 @@ def feeds(message=False, name=False):
feed = feedparser.parse(url)
news = []
for item in reversed(feed["items"]):
dateitem = utize(dateutil.parser.parse(item["published"]))
dateitem = stampy.stampy.utize(dateutil.parser.parse(item["published"]))

if utize(dateitem) > utize(datelastitem):
if stampy.stampy.utize(dateitem) > stampy.stampy.utize(datelastitem):
news.append(item)

logger.debug(msg=_L("# of feeds for today: %s") % len(news))

# Even if we don't have updated items, update the lastchecked
# date for interval to work properly
if len(news) == 0:
dateitem = utize(datelastitem)
dateitem = stampy.stampy.utize(datelastitem)
dateitemfor = dateitem.strftime('%Y/%m/%d %H:%M:%S')
feedsupdated.append({'name': name, 'gid': gid, 'dateitem': dateitemfor})

Expand All @@ -313,7 +312,7 @@ def feeds(message=False, name=False):
title = False

if url and title:
dateitem = utize(dateutil.parser.parse(item["published"]))
dateitem = stampy.stampy.utize(dateutil.parser.parse(item["published"]))
dateitemfor = dateitem.strftime('%Y/%m/%d %H:%M:%S')
itemtext = '*%s* *%s* - [%s](%s)' % (name, dateitem, title, url)
try:
Expand Down Expand Up @@ -381,24 +380,3 @@ def feeddel(name=False, gid=0):
stampy.stampy.dbsql(sql)
code = True
return code


def utize(date):
"""
Converts date to UTC tz
:param date: date to convert
:return:
"""

tz = pytz.timezone('GMT')

try:
code = date.astimezone(tz)

except:
try:
code = date.replace(tzinfo=tz)
except:
code = date

return code
5 changes: 4 additions & 1 deletion stampy/plugin/karma.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ def init():
:return: List of triggers for plugin
"""

triggers = ["++", "--", u"—", "@", "^rank", "^srank", "^skarma", "==", "^#cron"]
triggers = ["++", "--", u"—", "@", "^rank", "^srank", "^skarma", "=="]

stampy.stampy.cronme(name="karma", interval=24 * 60)

return triggers


Expand Down
5 changes: 4 additions & 1 deletion stampy/plugin/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ def init():
:return: List of triggers for plugin
"""

triggers = ["@all", "^/stats", "*", "^/getout", "^#cron"]
triggers = ["@all", "^/stats", "*", "^/getout"]

stampy.stampy.cronme(name="stats", interval=24 * 60)

return triggers


Expand Down
109 changes: 99 additions & 10 deletions stampy/stampy.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@
import sqlite3 as lite
import string
import sys
import time
import traceback
import urllib
from time import sleep

import dateutil.parser
import pytz
import requests

import plugin.config
Expand Down Expand Up @@ -636,11 +639,11 @@ def process(messages):
if "*" in trigger:
runplugin = True
break
elif trigger[0] == "^" and trigger != '^#cron':
elif trigger[0] == "^":
if command == trigger[1:]:
runplugin = True
break
elif trigger in texto and trigger != '^#cron':
elif trigger in texto:
runplugin = True
break

Expand Down Expand Up @@ -670,6 +673,27 @@ def process(messages):
clearupdates(offset=lastupdateid + 1)


def utize(date):
"""
Converts date to UTC tz
:param date: date to convert
:return:
"""

tz = pytz.timezone('GMT')

try:
code = date.astimezone(tz)

except:
try:
code = date.replace(tzinfo=tz)
except:
code = date

return code


def processcron():
"""
This function processes plugins with cron features
Expand All @@ -683,18 +707,83 @@ def processcron():

for i in plugs:
name = i.__name__.split(".")[-1]

runplugin = False
for trigger in plugtriggers[name]:
if "^#cron" in trigger:
runplugin = True
break

if runplugin:
if shouldrun(name=name):
logger.debug(msg=_L("Processing plugin cron: %s") % name)
i.cron()


def shouldrun(name):
"""
Checks name on database to see if it should run or not and updates as executed
:param name: Name to check on database
:return: Bool
"""

sql = "SELECT name,lastchecked,interval from cron where name='%s'" % name
cur = dbsql(sql)

date = utize(datetime.datetime.now())

# Formatted date to write back in database
datefor = date.strftime('%Y/%m/%d %H:%M:%S')

# Convert to epoch to properly compare
dateforts = time.mktime(date.timetuple())

code = False

for row in cur:
(name, lastchecked, interval) = row

try:
# Parse date or if in error, use past
datelast = utize(dateutil.parser.parse(lastchecked))

except:
datelast = utize(datetime.datetime(year=1981, month=1, day=24))

# Get time since last check on the feed (epoch)
datelastts = time.mktime(datelast.timetuple())
timediff = int((dateforts - datelastts) / 60)

# Check if interval is defined or set default
interval = int(interval)

if interval == 0:
interval = 1440

# If more time has passed since last check than the interval for
# checks, run the check

if timediff < interval:
logger.debug(msg=_L("Skipping job %s because last run was %s mins ago (%s required)") % (name, timediff, interval))
code = False
else:
code = True

# Update db with results
if code:
sql = "UPDATE cron SET lastchecked='%s' where name='%s'" % (datefor, name)
logger.debug(msg=_L("Updating last checked as per %s") % sql)
dbsql(sql=sql)
return code


def cronme(name=False, interval=5):
"""
Adds an entry in cron database for job name and interval in mins
:param name: name of job
:param interval: mins between executions
:return:
"""

if name:
sql = "DELETE from cron WHERE name='%s'" % name
dbsql(sql=sql)
sql = "INSERT INTO cron(name,interval) VALUES('%s', '%s')" % (name, interval)
dbsql(sql=sql)


def getitems(var):
"""
Returns list of items even if provided args are lists of lists
Expand Down
33 changes: 33 additions & 0 deletions stampy/versions/4ce73d5a92f4_create_cron_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""Create cron table
Revision ID: 4ce73d5a92f4
Revises: 59f006d4ef93
Create Date: 2017-08-05 16:04:39.277508
"""

# revision identifiers, used by Alembic.
revision = '4ce73d5a92f4'
down_revision = '59f006d4ef93'
branch_labels = None
depends_on = None

from alembic import op
import sqlalchemy as sa


def upgrade():
op.create_table(
'cron',
sa.Column('name', sa.Text),
sa.Column('interval', sa.Text),
sa.Column('lastchecked', sa.Text(), nullable=True)
)


def downgrade():
"""
Performs database downgrade
"""

op.drop_table('cron')

0 comments on commit 50467fe

Please sign in to comment.