示例#1
0
def schedule_check( job ):
  # make sure file exists and estimated time has been calculated
  if not os.path.exists( job['path'] ):
    return False
  
  if not job['estimated_time']:
    return False

  # load schedule
  schedule = database.get_schedule()

  current_time = datetime.datetime.now()
  hours, minutes = job['estimated_time'].split(":")

  # add minutes to time
  current_time = current_time.replace( minute=(current_time.minute + int(minutes) ) ) 
  current_hour = current_time.hour 

  # check to see if interval is all good
  for i in range(int(hours)+1):
    schedule_day = schedule[ str(current_time.weekday()) ]
    
    if schedule_day[ current_hour + i ] == 0:
      return False

  return True
示例#2
0
def update_schedule(channelid):
    if "twitch_user" not in session:
        return redirect(url_for("mainpage"))
    # Perform simple validation on the schedule. Tidying up human entry
    # is the job of the front end; if you send "1pm" to the back end,
    # you will simply get back an error, nothing more. The front end is
    # supposed to have already converted this to "13:00", which is the
    # only format we accept here.
    schedule = []
    sched = "<unknown cause>"  # in case we get an unexpected ValueError
    try:
        for day in range(7):
            sched = request.form.get("sched%d" % day, "")
            if ',' in sched: raise ValueError
            for time in sched.split():
                hr, min = time.split(
                    ":")  # Raises ValueError if wrong number of colons
                if not (0 <= int(hr) < 24):
                    raise ValueError  # Also raises if not integer
                if not (0 <= int(min) < 60): raise ValueError
            schedule.append(" ".join(sched.split()))
    except ValueError:
        return "Schedule format error: " + sched, 400
    tz = request.form.get("sched_tz")
    if not tz:
        # No TZ specified? Use what we have, if possible, otherwise
        # demand one from the user. The front end will normally try
        # to provide a default timezone, so most users won't have
        # to worry about this.
        tz = database.get_schedule(channelid)[0]
        if not tz:
            return "Please specify a timezone", 400
    database.set_schedule(channelid, tz, schedule)
    return redirect(url_for("mainpage"))
示例#3
0
def classinfo():
    if not session.has_key('user'):
        return redirect(url_for("about"))
    username=session['user']
    name=database.get_name(username)
    osis=database.get_osis(username)
    digits=database.get_id(username)
    email=database.get_email(username)
    schedule=database.get_schedule(username)
    classes=database.get_class_info()
    if request.method=='GET':
        return render_template("class.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,email=email
                               ,classes=classes
                               ,schedule=schedule
                               ,get=True)
    if request.method=="POST":
        value=request.form['button']
        value=value.split(" ")
        index=int(value[1])-1
        validate=True
        if (str(value[0])=="set"):
            period=classes[index][0]
            clas=classes[index]
            schedule=database.get_schedule(username)
            if schedule[int(period)-1][1]=="free":
                database.set_period(username,period,clas)
            else:
                validate=False
        if (str(value[0])=="req"):
            req=classes[index]
            period=classes[index][0]
            if database.has_lunch(username,period) or l_equal(schedule[int(period)-1],req):
                validate=False
            else:
                database.post_request(username,req)
        return render_template("class.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,email=email
                               ,classes=classes
                               ,schedule=schedule
                               ,validate=validate)
示例#4
0
def apply_schedule():
    with app.app_context():
        for entry in database.get_outputs():

            pin = entry['pin']
            output = entry['output']

            if isinstance(pin, int):
                schedule = database.get_schedule(output)
                output_scheduler.apply_outputs(schedule, pin)
示例#5
0
def mainpage(channelid=None):
    # NOTE: If we've *reduced* the required scopes, this will still force a re-login.
    # However, it'll be an easy login, as Twitch will recognize the existing auth.
    if "twitch_token" not in session or session.get(
            "twitch_auth_scopes") != REQUIRED_SCOPES:
        return render_template("login.html")
    user = session["twitch_user"]
    if channelid is None: channelid = user["_id"]
    try:
        channelid = str(int(channelid))
    except ValueError:
        # If you go to /editor/somename, redirect to /editor/equivalent-id
        # Bookmarking the version with the ID will be slightly faster, but
        # streamers will usually want to share the version with the name.
        users = query("helix/users", token="app", params={"login":
                                                          channelid})["data"]
        # users is either an empty list (bad login) or a list of one.
        if not users: return redirect("/")
        return redirect("/editor/" + users[0]["id"])
    if not may_edit_channel(user["_id"], channelid):
        return redirect(url_for("mainpage"))
    database.create_user(
        channelid
    )  # Just in case, make sure the database has the basic structure
    channel = get_channel_setup(channelid)
    sched_tz, schedule, sched_tweet = database.get_schedule(channelid)
    if "twitter_oauth" in session:
        auth = session["twitter_oauth"]
        username = auth["screen_name"]
        twitter = "Twitter connected: " + username
        tweets = list_scheduled_tweets(auth["oauth_token"],
                                       auth["oauth_token_secret"], sched_tz)
    else:
        twitter = Markup(
            """<div id="login-twitter"><a href="/login-twitter"><img src="/static/Twitter_Social_Icon_Square_Color.svg" alt="Twitter logo"><div>Connect with Twitter</div></a></div>"""
        )
        tweets = []
    error = session.get("last_error_message", "")
    session["last_error_message"] = ""
    return render_template(
        "index.html",
        twitter=twitter,
        username=user["display_name"],
        channel=channel,
        channelid=channelid,
        error=error,
        setups=database.list_setups(channelid),
        sched_tz=sched_tz,
        schedule=schedule,
        sched_tweet=sched_tweet,
        checklist=database.get_checklist(channelid),
        timers=database.list_timers(channelid),
        tweets=tweets,
    )
示例#6
0
def profile():
    if not session.has_key('user'):
        return redirect(url_for('about'))
    username=session['user']
    name=database.get_name(username)
    osis=database.get_osis(username)
    digits=database.get_id(username)
    email=database.get_email(username)
    schedule=database.get_schedule(username)
    notif=database.get_notification(username)
    if request.method=='GET':        
        return render_template("profile.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,schedule=schedule
                               ,email=email
                               ,accept=notif["accept"]
                               ,accepted=notif["accepted"]
                               )
    elif request.method=="POST":
        value=request.form["button"]
        value=value.split(" ")
        index=int(value[1])-1
        if str(value[0])=="drop":
            schedule=database.get_schedule(username)
            clas=schedule[index]
            if not (clas[1]=="free" or clas[1]=="Cafe"):
                database.drop_period(username,clas[0])
                schedule=database.get_schedule(username)
        return render_template("profile.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,schedule=schedule
                               ,email=email
                               ,accept=notif["accept"]
                               ,accepted=notif["accepted"]
                               )
示例#7
0
def edit():
    if not session.has_key('user'):
        return redirect(url_for("about"))
    username=session['user']
    email=database.get_email(username)
    osis=database.get_osis(username)
    digit=database.get_id(username)
    if request.method=='GET':
        return render_template("edit.html"
                               ,username=username
                               ,email=email
                               ,osis=osis
                               ,digit=digit
                               ,loggedout=False)
    if request.method=='POST':
        if request.form['button']=='Edit':
            password=request.form['password']
            email=request.form['email']
            digit=request.form['digit']
            osis=request.form['osis']
            lunch=request.form['lunch']
            schedule=database.get_schedule(username)
            current_lunch=database.get_lunch(username)
            pos=database.get_period(username,int(lunch))[1]
            if not (pos == 'free' or pos=='Cafe'):
                return render_template("edit.html"
                                       ,username=username
                                       ,email=email
                                       ,osis=osis
                                       ,digit=digit
                                       ,loggedout=False
                                       ,invalid=True)
            database.set_period(username,current_lunch,["","free","n/a","",""])
            database.set_period(username,lunch,[str(lunch),"Cafe","Chi Kun Wang","ZLN5","0"+str(lunch)])
            database.set_password(username,password)
            database.set_email(username,email)
            database.set_id(username,digit)
            database.set_osis(username,osis)
            return redirect(url_for('profile'))
        return redirect(url_for('edit'))
示例#8
0
def visit(username=""):
    if not session.has_key('user'):
        return redirect(url_for('about'))
    me=session['user']
    if str(username)==str(me):
        return redirect(url_for('profile'))
    name=database.get_name(username)
    osis=database.get_osis(username)
    digits=database.get_id(username)
    email=database.get_email(username)
    schedule=database.get_schedule(username)
    notif=database.get_notification(username)
    if request.method=='GET':        
        return render_template("visit.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,schedule=schedule
                               ,email=email
                               ,accept=notif["accept"]
                               ,accepted=notif["accepted"]
                               )
示例#9
0
def make_backup(channelid):
    twitchid = channelid
    response = "{\n"
    # Setups
    setups = database.list_setups(twitchid)
    response += '\t"setups": [\n'
    fields = "category", "title", "tags", "tweet"
    for setup in setups:
        setup = {field: setup[field] for field in fields}
        response += "\t\t" + json.dumps(setup) + ",\n"
    response += '\t\t""\n\t],\n'
    # Schedule
    tz, sched, sched_tweet = database.get_schedule(twitchid)
    response += '\t"schedule": [\n'
    for day in sched:
        response += "\t\t" + json.dumps(day) + ",\n"
    response += "\t\t%s,\n\t\t%d\n\t],\n" % (json.dumps(tz), sched_tweet)
    # Checklist
    checklist = database.get_checklist(twitchid).strip().split("\n")
    response += '\t"checklist": [\n'
    for item in checklist:
        response += "\t\t" + json.dumps(item) + ",\n"
    response += '\t\t""\n\t],\n'  # Empty string as shim. Ignored on import.
    # Timers
    timers = database.list_timers(twitchid, full=True)
    response += '\t"timers": [\n'
    for timer in timers:
        item = dict(zip("id title delta maxtime styling".split(), timer))
        response += "\t\t" + json.dumps(item) + ",\n"
    response += '\t\t""\n\t],\n'
    # Footer (marker to show that the file was correctly downloaded)
    # This must NOT include any sort of timestamp, as the backup file
    # must be completely stable (taking two backups without changing
    # anything should result in bit-for-bit identical files).
    response += '\t"": "Mustard-Mine Backup"\n}\n'
    return Response(response,
                    mimetype="application/json",
                    headers={"Content-disposition": "attachment"})
示例#10
0
def tradingfloor():
    if not session.has_key('user'):
        return redirect(url_for("about"))
    username=session['user']
    name=database.get_name(username)
    osis=database.get_osis(username)
    digits=database.get_id(username)
    email=database.get_email(username)
    database.refresh_floor()
    floor=database.get_floor()
    if request.method=='GET':
        return render_template("trading.html"
                               ,name=name
                               ,osis=osis
                               ,digits=digits
                               ,floor=floor
                               ,email=email
                               ,validate=False)
    if request.method=='POST':
        value=request.form["button"]
        value=value.split(" ")
        index=int(value[1])-1
        req=floor[index]["request"]
        period=int(req[0])-1
        acceptername=username
        postername=floor[index]['username']
        schedule=database.get_schedule(username)[period]
        validate=False
        myself=False
        illegaldel=False
        try:
            if not str(postername)==str(username):
                if value[0]=="accept":
                    if l_equal(req,schedule):
                        database.accept_request(postername,acceptername,req)
                        return redirect(url_for("tradingfloor"))
                    else:
                        validate=True
                elif value[0]=="delete":
                    validate=True
                    myself=False
                    illegaldel=True
            else:
                if value[0]=="accept":
                    validate=True
                    myself=True
                else:
                    database.remove_request(username,req)
                    database.refresh_floor()
                    floor=database.get_floor()
            return render_template("trading.html"
                                   ,name=name
                                   ,osis=osis
                                   ,digits=digits
                                   ,email=email
                                   ,floor=floor
                                   ,validate=validate
                                   ,myself=myself
                                   ,illegaldel=illegaldel)
        except Exception:
            return render_template("trading.html"
                                   ,name=name
                                   ,osis=osis
                                   ,digits=digits
                                   ,email=email
                                   ,floor=floor
                                   ,validate=True)
示例#11
0
def get_user_tweets():
    auth = session["twitter_oauth"]
    sched_tz = database.get_schedule(session["twitch_user"]["_id"])[0]
    return list_scheduled_tweets(auth["oauth_token"],
                                 auth["oauth_token_secret"], sched_tz)