2 Revize 2d4873e342 ... bf463930bd

Autor SHA1 Zpráva Datum
  deadtom bf463930bd Changed all except Error entries to except Exception před 3 týdny
  deadtom 6632e7fef2 Added template for GiveButter alert overlays před 3 týdny

+ 1 - 1
ownchatbot/__init__.py

@@ -62,7 +62,7 @@ def create_app(test_config=None):
             send_system_chat(message)
             current_index = (current_index + 1) % len(announcements)
         except Exception as a_error:
-            app.logger.error(f'Couldn\'t make announcement: {a_error.args[0]}')
+            app.logger.error(f'Couldn\'t make announcement: {a_error}')
                 
     def award_job():
         with app.app_context():

+ 1 - 1
ownchatbot/bot_messages.py

@@ -177,7 +177,7 @@ ANNOUNCE_INTERVAL = {announce_dict['ANNOUNCE_INTERVAL']}  # How long, in minutes
             f.write(new_announce)
             f.close()
     except Exception as saerror:
-        current_app.logger.error(f'Couldn\'t save announce.py: {saerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t save announce.py: {saerror}')
         return False
 
     current_app.config.from_pyfile('announce.py', silent=True)

+ 16 - 16
ownchatbot/db.py

@@ -17,7 +17,7 @@ def rem_from_queue(reward_name):  # Remove a reward from the queue
         )
         db.commit()
     except sqlite3.Error as rfqerror:
-        current_app.logger.error(f'Couldn\'t remove {reward_name} from reward queue: {rfqerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t remove {reward_name} from reward queue: {rfqerror}')
         return False
     return True
 
@@ -96,7 +96,7 @@ def clear_reward_queue():  # Completely clear the reward queue
         )
         db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t clear reward queue: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t clear reward queue: {serror}')
         return False
     return True
 
@@ -110,7 +110,7 @@ def clear_fulfilled_rewards():  # Clears only fulfilled rewards from the queue
         )
         db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t clear fulfilled rewards: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t clear fulfilled rewards: {serror}')
         return False
     return True
 
@@ -122,7 +122,7 @@ def rem_all_votes():  # USED TO BE "clear_votes" Clear all votes from the databa
         db.execute("DELETE FROM votes")
         db.commit()
     except sqlite3.Error as cverror:
-        current_app.logger.error(f'Couldn\'t clear all votes: {cverror.args[0]}')
+        current_app.logger.error(f'Couldn\'t clear all votes: {cverror}')
         return False
     if put_votes(db):
         return True
@@ -135,7 +135,7 @@ def rem_vote():  # Remove a single vote from the database
         db.execute("DELETE FROM votes WHERE name = ?", ('vote',))
         db.commit()
     except sqlite3.Error as rverror:
-        current_app.logger.error(f'Couldn\'t remove \"{vote}\" from database: {rverror.args[0]}')
+        current_app.logger.error(f'Couldn\'t remove \"{vote}\" from database: {rverror}')
         return False
     if put_votes(db):
         return True
@@ -153,7 +153,7 @@ def is_cool(reward_name):  # Check if a reward is cooling down.
                 )
             current_cds = cursor.fetchall()
         except sqlite3.Error as icerror:
-            current_app.logger.error(f'Couldn\'t get \"{reward_name}\" from database: {icerror.args[0]}')
+            current_app.logger.error(f'Couldn\'t get \"{reward_name}\" from database: {icerror}')
         if current_cds:
             last_time = current_cds[0][0]
             hot_time = current_time - last_time
@@ -169,7 +169,7 @@ def is_cool(reward_name):  # Check if a reward is cooling down.
                     db.commit()
                     return True, 0
                 except sqlite3.Error as scerror:
-                    current_app.logger.error(f'Couldn\'t update \"{reward_name}\"\'s cooldown time in the database: {scerror.args[0]}')
+                    current_app.logger.error(f'Couldn\'t update \"{reward_name}\"\'s cooldown time in the database: {scerror}')
         else:  # If it is not in the database, add it and return True
             try:
                 db.execute(
@@ -179,7 +179,7 @@ def is_cool(reward_name):  # Check if a reward is cooling down.
                 db.commit()
                 return True, 0
             except sqlite3.Error as scerror:
-                current_app.logger.error(f'Couldn\'t add \"{reward_name}\" to database: {scerror.args[0]}')
+                current_app.logger.error(f'Couldn\'t add \"{reward_name}\" to database: {scerror}')
     else:  # If the redeem has no cooldown
         return True, 0
 
@@ -192,7 +192,7 @@ def rem_cool(reward_name):  # Remove a reward from the database
             )
         current_cds = cursor.fetchall()
     except sqlite3.Error as icerror:
-        current_app.logger.error(f'Couldn\'t remove \"{reward_name}\" from database: {icerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t remove \"{reward_name}\" from database: {icerror}')
         return False
     return True
 
@@ -208,7 +208,7 @@ def put_votes(db):  # Reread votes from rewards.py, and sync with database
                 )
                 db.commit()
             except sqlite3.Error as serror:
-                current_app.logger.error(f'Couldn\'t insert \"{vote}\" into database: {serror.args[0]}')
+                current_app.logger.error(f'Couldn\'t insert \"{vote}\" into database: {serror}')
                 return False
     return True
 
@@ -230,7 +230,7 @@ def reread_votes():  # Reread votes from rewards.py, and sync with database
             cursor.execute("DELETE FROM votes WHERE name = ?", (vote,))
         db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t clear deleted votes from database: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t clear deleted votes from database: {serror}')
         return False
 
     try:  # Add new votes found in rewards.py
@@ -255,7 +255,7 @@ def reread_votes():  # Reread votes from rewards.py, and sync with database
                     )
                 db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t insert \"{vote}\" into database: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t insert \"{vote}\" into database: {serror}')
         return False
     return True
 
@@ -277,7 +277,7 @@ def reread_goals():  # Reread goals from rewards.py, and sync with database
             cursor.execute("DELETE FROM goals WHERE name = ?", (goal,))
         db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t clear removed goals from database: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t clear removed goals from database: {serror}')
         return False
 
     try:  # Add new goals found in rewards.py
@@ -300,7 +300,7 @@ def reread_goals():  # Reread goals from rewards.py, and sync with database
                     )
         db.commit()
     except sqlite3.Error as serror:
-        current_app.logger.error(f'Couldn\'t insert \"{reward}\" into database: {serror.args[0]}')
+        current_app.logger.error(f'Couldn\'t insert \"{reward}\" into database: {serror}')
         return False
     return True
 
@@ -321,7 +321,7 @@ def reset_goal(goal):  # Set goal progress back to zero
         db.commit()
         return True
     except sqlite3.Error as rgerror:
-        current_app.logger.error(f'Couldn\'t reset {goal} in the goals table: {rgerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t reset {goal} in the goals table: {rgerror}')
         return False
 
 
@@ -339,7 +339,7 @@ def reset_vote(vote):
                     )
             db.commit()
         except sqlite3.Error as rverror:
-            current_app.logger.error(f'Couldn\'t reset {vote} in the votes table: {rverror.args[0]}')
+            current_app.logger.error(f'Couldn\'t reset {vote} in the votes table: {rverror}')
             return False
     return True
 

+ 1 - 1
ownchatbot/defaults/alerts.py

@@ -1,2 +1,2 @@
-ALERTS = {'m_name': '', 'm_reward': '', 'g_name': '', 'g_reward': '', 'follower': ''}
+ALERTS = {'m_name': '', 'm_reward': '', 'g_name': '', 'g_reward': '', 'follower': '', 'gb_name': ''}
 

+ 15 - 7
ownchatbot/donation_handlers.py

@@ -4,6 +4,7 @@ from ownchatbot.db import get_db
 from ownchatbot.user_handlers import get_id_by_email, award_chat_points, add_email_to_points, get_all_users_with_user_id
 from ownchatbot.owncast_com import send_chat, send_private_chat
 from ownchatbot.bot_messages import porps
+from ownchatbot.reward_handlers import save_alerts
 import json
 import os
 
@@ -11,6 +12,7 @@ import os
 def accept_donation(donation_info, donation_points, donation_service):
     try:
         db = get_db()
+        alerts_dict = current_app.config['ALERTS']
         is_public = donation_info[0]
         email = donation_info[2]
         amount = donation_info[3]
@@ -21,26 +23,32 @@ def accept_donation(donation_info, donation_points, donation_service):
         if not ids:  # If no id found with that email address
             if add_email_to_points(db, email, points):  # Create empty account with email and points
                 name = 'Someone'
+                alerts_dict['gb_name'] = 'New Donation!'
                 current_app.logger.info(f'No user with email \"{email}\" found in database, created empty account.')
         else:  # Grant points to the corresponding id
             for id in ids:
                 if award_chat_points(db, id[0], points):  # Grant points
                     for user in get_all_users_with_user_id(db, id[0]):
                         name = user[1]
+                        alerts_dict['gb_name'] = name
                         if not name:
                             name = 'Someone'
+                            alerts_dict['gb_name'] = 'New Donation!'
                     current_app.logger.info(f'Granted user id {id[0]} {porps(points)} for their ${amount} donation.')
         if is_public:
             message = f'{name} got {porps(points)} for donating ${amount} on {donation_service}!'
+            alerts_dict['gb_name'] = name
             current_app.logger.info(f'Public donation of ${amount} received from {name} via {donation_service}. Granted {porps(points)}.')
         else:
-            message = None
+            message = f'We got an anonymous donation of ${amount}!'
+            alerts_dict['gb_name'] = 'New Donation!'
             current_app.logger.info(f'Anonymous donation of ${amount} received via {donation_service}')
-        if message is not None:  # Only send chat message if it's a public donation
-            send_chat(message)
+        if donation_service == 'GiveButter':  # If a GiveButter donation, update alerts.py, to trigger alert
+            save_alerts(alerts_dict)
+        send_chat(message)  # Send message to chat
         return True
     except Exception as aderror:
-        current_app.logger.error(f'General Exception: {aderror}')
+        current_app.logger.error(f'A general exception occurred in accept_donation: {aderror}')
 
 
 def accept_kofi_sub(sub_info, sub_points):
@@ -92,7 +100,7 @@ def accept_kofi_sub(sub_info, sub_points):
             send_private_chat(id[0], message)
         return True
     except Exception as aderror:
-        current_app.logger.error(f'General Exception: {aderror}')
+        current_app.logger.error(f'A general exception occurred in accept_kofi_sub: {aderror}')
 
 
 def save_kofi_settings(ksettings_info):  # Write settings to kofi.py
@@ -103,7 +111,7 @@ def save_kofi_settings(ksettings_info):  # Write settings to kofi.py
         f.close
         current_app.config.from_pyfile('kofi.py', silent=True)  # Reread kofi.py into the app
     except Exception as sks_error:
-        current_app.logger.error(f'Couldn\'t save kofi.py: {sks_error.args[0]}')
+        current_app.logger.error(f'Couldn\'t save kofi.py: {sks_error}')
         return False
 
     return True
@@ -117,7 +125,7 @@ def save_gb_settings(gbsettings_info):  # Write settings to givebutter.py
         f.close
         current_app.config.from_pyfile('givebutter.py', silent=True)  # Reread givebutter.py into the app
     except Exception as sgbs_error:
-        current_app.logger.error(f'Couldn\'t save givebutter.py: {sgbs_error.args[0]}')
+        current_app.logger.error(f'Couldn\'t save givebutter.py: {sgbs_error}')
         return False
 
     return True

+ 7 - 7
ownchatbot/owncast_com.py

@@ -21,7 +21,7 @@ def get_client_id(user_id):
             current_app.logger.info('Not a connected client. Can\'t get client ID.')
             return False
     except requests.exceptions.RequestException as gcierror:
-        current_app.logger.error(f'Couldn\'t get client id from Owncast: {gcierror.args[0]}')
+        current_app.logger.error(f'Couldn\'t get client id from Owncast: {gcierror}')
         return False
 
 
@@ -36,7 +36,7 @@ def live_now():  # Check if stream is live
             else:
                 return False
         except requests.exceptions.RequestException as cserror:
-            current_app.logger.error(f'Couldn\'t check if stream is live: {cserror.args[0]}')
+            current_app.logger.error(f'Couldn\'t check if stream is live: {cserror}')
             return False
     else:
         current_app.logger.error('Owncast url is not set. Can\'t check if stream is live.')
@@ -52,7 +52,7 @@ def award_points(db):  # Award points to users
     try:
         response = requests.get(url, headers=headers)
     except requests.exceptions.RequestException as aperror:
-        current_app.logger.error(f'Couldn\'t get user info: {aperror.args[0]}')
+        current_app.logger.error(f'Couldn\'t get user info: {aperror}')
         return
     if response.status_code != 200:
         current_app.logger.error(f'Couldn\'t award points: {response.status_code}.')
@@ -71,7 +71,7 @@ def send_chat(message):  # Send message to owncast chat
     try:
         response = requests.post(url, headers=headers, json={'body': message})
     except requests.exceptions.RequestException as scerror:
-        current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {scerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {scerror}')
         return
     if response.status_code != 200:
         current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {response.status_code}.')
@@ -90,9 +90,9 @@ def send_private_chat(user_id, message):
         try:
             response = requests.post(url, headers=headers, json={'body': message})
         except requests.exceptions.RequestException as swerror:
-            current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {swerror.args[0]}')
+            current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {swerror}')
         except Exception as swerror:
-            current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {swerror.args[0]}')
+            current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {swerror}')
         if response.status_code != 200:
             current_app.logger.error(f'Couldn\'t send \"{message}\" to Owncast: {response.status_code}.')
     else:
@@ -108,7 +108,7 @@ def send_system_chat(message):
     try:
         response = requests.post(url, headers=headers, json={'body': message})
     except requests.exceptions.RequestException as swerror:
-        current_app.logger.error(f'Couldn\'t send {message} to Owncast: {swerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t send {message} to Owncast: {swerror}')
         sys.exit()
     if response.status_code != 200:
         current_app.logger.error(f'Couldn\'t send {message} to Owncast: {response.status_code}.')

+ 37 - 37
ownchatbot/reward_handlers.py

@@ -24,8 +24,8 @@ def check_vote(db, vote_name, user_id):  # Check if user has already voted on th
             return False
         if row[0] == user_id:
             return True
-    except Error as cverror:
-        current_app.logger.error(f'Couldn\'t check if {user_id} already voted on \"{vote_name}\": {cverror.args[0]}')
+    except Exception as cverror:
+        current_app.logger.error(f'Couldn\'t check if {user_id} already voted on \"{vote_name}\": {cverror}')
 
 
 def add_to_vote(db, vote_name, user_id):  # Add a count to a vote
@@ -45,8 +45,8 @@ def add_to_vote(db, vote_name, user_id):  # Add a count to a vote
             )
             db.commit()
             return True
-    except Error as terror:
-        current_app.logger.error(f'Couldn\'t add to \"{vote_name}\" vote: {terror.args[0]}')
+    except Exception as terror:
+        current_app.logger.error(f'Couldn\'t add to \"{vote_name}\" vote: {terror}')
     return False
 
 
@@ -58,8 +58,8 @@ def add_to_queue(db, user_id, reward_name):  # Add a reward to the queue
             )
         db.commit()
         return True
-    except Error as qerror:
-        current_app.logger.error(f'Couldn\'t add to reward \"{reward_name}\" for {user_id} queue: {qerror.args[0]}')
+    except Exception as qerror:
+        current_app.logger.error(f'Couldn\'t add to reward \"{reward_name}\" for {user_id} queue: {qerror}')
     return False
 
 
@@ -67,7 +67,7 @@ def run_script(reward_name, script_cmd):  # Run a script form a special reward
     try:
         subprocess.check_call(script_cmd, shell=True)
     except Exception as scerror:
-        current_app.logger.error(f'Couldn\'t run script \"{reward_name}\": {scerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t run script \"{reward_name}\": {scerror}')
         return False
     return True
 
@@ -94,8 +94,8 @@ def add_to_goal(db, user_id, reward_name, points_contributed):  # Add a contribu
             )
             db.commit()
             return True
-    except Error as gerror:
-        current_app.logger.error(f'Couldn\'t update goal: {gerror.args[0]}')
+    except Exception as gerror:
+        current_app.logger.error(f'Couldn\'t update goal: {gerror}')
         return False
 
 
@@ -112,8 +112,8 @@ def goal_left(db, reward_name):
             progress, target = row
             left = target - progress
         return left
-    except Error as glerror:
-        current_app.logger.error(f'Couldn\'t check progress for \"{reward_name}\" goal: {glerror.args[0]}')
+    except Exception as glerror:
+        current_app.logger.error(f'Couldn\'t check progress for \"{reward_name}\" goal: {glerror}')
 
 
 def goal_reached(db, reward_name):  # Set a goal as completed
@@ -127,8 +127,8 @@ def goal_reached(db, reward_name):  # Set a goal as completed
             current_app.logger.error(f'{reward_name} not found in goal table.')
         else:
             return row[0]
-    except Error as grerror:
-        current_app.logger.error(f'Couldn\'t check if goal was met: {grerror.args[0]}')
+    except Exception as grerror:
+        current_app.logger.error(f'Couldn\'t check if goal was met: {grerror}')
         return False
 
 
@@ -195,8 +195,8 @@ def was_milestone_reached(db, reward_name):  # Check if a milestone was reached
             else:
                 return False
         return False
-    except Error as wmrerror:
-        current_app.logger.error(f'Couldn\'t check if a milestone was reached: {wmrerror.args[0]}')
+    except Exception as wmrerror:
+        current_app.logger.error(f'Couldn\'t check if a milestone was reached: {wmrerror}')
         return False
 
 
@@ -219,8 +219,8 @@ def was_goal_reached(db, reward_name):  # Check if a goal was reached
                 db.commit()
                 return True
         return False
-    except Error as wgrerror:
-        current_app.logger.error(f'Couldn\'t mark goal met: {wgrerror.args[0]}')
+    except Exception as wgrerror:
+        current_app.logger.error(f'Couldn\'t mark goal met: {wgrerror}')
         return False
 
 
@@ -230,8 +230,8 @@ def all_votes(db):  # Get all the votes
             "SELECT votes.name, votes.count, votes.info FROM votes"
         )
         return cursor.fetchall()
-    except Error as aterror:
-        current_app.logger.error(f'Couldn\'t select all votes: {aterror.args[0]}')
+    except Exception as aterror:
+        current_app.logger.error(f'Couldn\'t select all votes: {aterror}')
 
 
 def refund_reward(db, reward_id):  # Refund a user for a particular reward
@@ -244,8 +244,8 @@ def refund_reward(db, reward_id):  # Refund a user for a particular reward
         db.commit()
         current_app.logger.info(f'Set {reward_id} as refunded in the database')
         return True
-    except Error as rferror:
-        current_app.logger.error(f'Couldn\'t refund reward id {reward_id}: {rferror.args[0]}')
+    except Exception as rferror:
+        current_app.logger.error(f'Couldn\'t refund reward id {reward_id}: {rferror}')
         return False
 
 
@@ -259,8 +259,8 @@ def fulfill_reward(db, reward_id):  # Mark a reward as fulfilled in the database
         db.commit()
         current_app.logger.info(f'{reward_id} marked fulfilled.')
         return True
-    except Error as frerror:
-        current_app.logger.error(f'Couldn\'t  fulfill reward id {reward_id}: {frerror.args[0]}')
+    except Exception as frerror:
+        current_app.logger.error(f'Couldn\'t  fulfill reward id {reward_id}: {frerror}')
         return False
 
 
@@ -283,7 +283,7 @@ def all_goals(db):  # Get all the goals
         )
         return cursor.fetchall()
     except Exception as agerror:
-        current_app.logger.error(f'Couldn\'t select all goals: {agerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t select all goals: {agerror}')
 
 
 def all_active_goals(db):  # Get only active goals
@@ -330,7 +330,7 @@ def save_alerts(alerts_dict):  # Write alerts to alerts.py
         af.close
         current_app.logger.info('Saved new alerts.py.')
     except Exception as saerror:
-        current_app.logger.error(f'Couldn\'t save alerts.py: {saerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t save alerts.py: {saerror}')
         return False
 
     current_app.config.from_pyfile('alerts.py', silent=True)  # Reread alerts.py into the app
@@ -365,7 +365,7 @@ def save_rewards(reward_info):  # Write rewards to rewards.py
             rf.write(f'REWARDS = {new_rewards}')
             rf.close()
     except Exception as srerror:
-        current_app.logger.error(f'Couldn\'t save rewards.py: {srerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t save rewards.py: {srerror}')
         return False
 
     return True
@@ -391,7 +391,7 @@ PREFIX = '{config_dict['PREFIX']}'"
             cf.write(new_settings)
         cf.close
     except Exception as scerror:
-        current_app.logger.error(f'Couldn\'t save config.py: {scerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t save config.py: {scerror}')
         return False
 
     current_app.config.from_pyfile('config.py', silent=True)  # Reread config.py into the app
@@ -414,8 +414,8 @@ def reread_categories():  # Read _CAT varaibles and write to categories.py
         f.close
 
         current_app.config.from_pyfile('categories.py', silent=True)  # Reread categories into the app
-    except Error as rcerror:
-        current_app.logger.error(f'Couldn\'t reread categories: {rcerror.args[0]}')
+    except Exception as rcerror:
+        current_app.logger.error(f'Couldn\'t reread categories: {rcerror}')
 
 
 def activate_category(category):  # Move an item from the ACTIVE_CAT list to the INACTIVE_CAT list
@@ -426,8 +426,8 @@ def activate_category(category):  # Move an item from the ACTIVE_CAT list to the
         active_categories.append(category)  # Add to ACTIVE_CAT
         inactive_categories.remove(category)  # Remove from INACTIVE_CAT
         reread_categories()
-    except Error as acerror:
-        current_app.logger.error(f'Couldn\'t activate {category}: {acerror.args[0]}')
+    except Exception as acerror:
+        current_app.logger.error(f'Couldn\'t activate {category}: {acerror}')
 
 
 def deactivate_category(category):  # Move an item from the INACTIVE_CAT list to the ACTIVE_CAT list
@@ -438,8 +438,8 @@ def deactivate_category(category):  # Move an item from the INACTIVE_CAT list to
         active_categories.remove(category)  # Remove from ACTIVE_CAT
         inactive_categories.append(category)  # Add to INACTIVE_CAT
         reread_categories()
-    except Error as dcerror:
-        current_app.logger.error(f'Couldn\'t deactivate {category}: {dcerror.args[0]}')
+    except Exception as dcerror:
+        current_app.logger.error(f'Couldn\'t deactivate {category}: {dcerror}')
 
 
 def get_queue(db):  # Get the reward queue and the username
@@ -451,8 +451,8 @@ def get_queue(db):  # Get the reward queue and the username
             on reward_queue.user_id = points.id"""
         )
         return cursor.fetchall()
-    except Error as gqerror:
-        current_app.logger.error(f'Couldn\'t get queue: {gqerror.args[0]}')
+    except Exception as gqerror:
+        current_app.logger.error(f'Couldn\'t get queue: {gqerror}')
 
 
 def is_reward_active(reward_name):  # Check if reward is active
@@ -470,5 +470,5 @@ def is_reward_active(reward_name):  # Check if reward is active
             else:
                 return True
         return None
-    except Error as iraerror:
-        current_app.logger.error(f'Couldn\'t check if {reward_name} is active: {iraerror.args[0]}')
+    except Exception as iraerror:
+        current_app.logger.error(f'Couldn\'t check if {reward_name} is active: {iraerror}')

+ 18 - 0
ownchatbot/templates/mgmt.html

@@ -667,6 +667,24 @@
                         <a href="{{ url_for('web_panels.del_alert', alert_type='GOAL_ALERT') }}"><button id="new_goal_image_upload" class="button button2" onclick="openTab(event, 'alerts')"><span style="color: yellow;">Clear</span></button></a></td>
                     <td>{{ settings_info[8] }}/alert/goal</td>
                 </tr>
+                <tr>
+                    <form id="new_gb_image_upload" action="/mgmt/alertupload/GB_ALERT" method="post" enctype="multipart/form-data">
+                    <td>Goal Reached:</td>
+                    {% set gb_alert = alerts_dict["GB_ALERT"] %}
+                    {% if gb_alert %}
+                        {% if "webm" in gb_alert %}
+                            <td><video height="100" autoplay loop><source src="{{ url_for('web_panels.assets', asset_name=gb_alert) }}" type="video/webm"></video></td>
+                        {% else %}
+                            <td><img alt="User Configurable Image" src="{{ url_for('web_panels.assets', asset_name=gb_alert) }}"></td>
+                        {% endif %}
+                    {% else %}
+                        <td>Empty</td>
+                    {% endif %}
+                    <td><input type="file" name="GB_ALERT" accept=".gif, .jpg, .jpeg, .png, .webm" required></td>
+                    <td><button id="new_gb_image_upload" class="button button2" type="submit">Upload</button></form>&nbsp
+                        <a href="{{ url_for('web_panels.del_alert', alert_type='GB_ALERT') }}"><button id="new_gb_image_upload" class="button button2" onclick="openTab(event, 'alerts')"><span style="color: yellow;">Clear</span></button></a></td>
+                    <td>{{ settings_info[8] }}/alert/goal</td>
+                </tr>
         </table>
         <h3>Stream Overlays</h3>
         To use these alerts, create a browser source in your streaming software, using the URLs specified above.<br>

+ 55 - 0
ownchatbot/templates/rgbdonation.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="stylesheet" href="{{ url_for('static', filename='alertstyle.css') }}">
+    <title>GiveButter Donation Alert</title>
+</head>
+<body>
+    {% if not alert_name %}
+        <div id="alertVid"></div>
+        <div id="alertImg"></div>
+    {% elif "webm" in alert_name %}
+        <video id="alertVid" autoplay>
+            <source src="{{ url_for('web_panels.assets', asset_name=alert_name) }}" type="video/webm">
+        </video>
+        <div id="alertImg"></div>
+    {% else %}
+        <div id="alertVid"></div>
+        <img id="alertImg" src="{{ url_for('web_panels.assets', asset_name=alert_name) }}">
+    {% endif %}
+
+    <div id="nameBox"></div>
+
+    <script>
+        setInterval(function() {
+            fetch('/checkGBs')
+                .then(response => response.json())
+                .then(data => {
+                    if (data) {
+                        const alertVid = document.getElementById('alertVid');
+                        const alertImg = document.getElementById('alertImg');
+                        const nameBox = document.getElementById('nameBox');
+
+                        const alertName = data.name;
+
+                        nameBox.innerHTML = `
+                            ${alertName}
+                        `;
+                        nameBox.style.display = 'block';
+
+                        alertVid.style.display = 'block';
+                        alertImg.style.display = 'block';
+
+                        setTimeout(() => {
+                            alertVid.style.display = 'none';
+                            alertImg.style.display = 'none';
+                            nameBox.style.display = 'none';
+                        }, 10000); // Visible for 10 seconds
+                    }
+                });
+        }, 3000); // Check for new donation every 3 seconds
+    </script>
+</body>
+</html>

+ 1 - 1
ownchatbot/templates/rgoal.html

@@ -49,7 +49,7 @@
                         }, 10000); // Visible for 10 seconds
                     }
                 });
-        }, 3000); // Check for new followers every 3 seconds
+        }, 3000); // Check for new goal every 3 seconds
     </script>
 </body>
 </html>

+ 1 - 1
ownchatbot/templates/rmilestone.html

@@ -49,7 +49,7 @@
                         }, 10000); // Visible for 10 seconds
                     }
                 });
-        }, 3000); // Check for new followers every 3 seconds
+        }, 3000); // Check for new milestone every 3 seconds
     </script>
 </body>
 </html>

+ 38 - 38
ownchatbot/user_handlers.py

@@ -17,7 +17,7 @@ def save_todolist(list_items):  # Save todo list items
         current_app.config.from_pyfile('todo.py', silent=True)  # Reread the list into the app
         return True
     except Exception as stdlerror:
-        current_app.logger.error(f'Couldn\'t save todo.py: {stdlerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t save todo.py: {stdlerror}')
         return False
 
 
@@ -28,8 +28,8 @@ def get_users_points(db, user_id):  # Look up one user's points by user id
             (user_id,)
         )
         return cursor.fetchone()[0]
-    except Error as guperror:
-        current_app.logger.error(f'Couldn\'t look up points for {user_id}: {guperror.args[0]}')
+    except Exception as guperror:
+        current_app.logger.error(f'Couldn\'t look up points for {user_id}: {guperror}')
 
 
 def get_email_code(db, user_id):  # Get user's verification code
@@ -39,8 +39,8 @@ def get_email_code(db, user_id):  # Get user's verification code
             (user_id,)
         )
         return cursor.fetchone()[0]
-    except Error as gecerror:
-        current_app.logger.error(f'Couldn\'t look up points for {user_id}: {gecerror.args[0]}')
+    except Exception as gecerror:
+        current_app.logger.error(f'Couldn\'t look up points for {user_id}: {gecerror}')
 
 
 def get_id_by_email(db, email):  # Look up all users' points by username
@@ -51,8 +51,8 @@ def get_id_by_email(db, email):  # Look up all users' points by username
         )
         users = cursor.fetchall()
         return users
-    except Error as gaubeerror:
-        current_app.logger.error(f'Couldn\'t look up user id for {email} by email: {gaubeerror.args[0]}')
+    except Exception as gaubeerror:
+        current_app.logger.error(f'Couldn\'t look up user id for {email} by email: {gaubeerror}')
 
 
 def get_all_users_by_name(db, username):  # Look up all users' points by username
@@ -63,8 +63,8 @@ def get_all_users_by_name(db, username):  # Look up all users' points by usernam
         )
         users = cursor.fetchall()
         return users
-    except Error as gaubnerror:
-        current_app.logger.error(f'Couldn\'t look up points for {username} by username: {gaubnerror.args[0]}')
+    except Exception as gaubnerror:
+        current_app.logger.error(f'Couldn\'t look up points for {username} by username: {gaubnerror}')
 
 
 def get_all_users_with_user_id(db, user_id):  # Look up all users' points by user id
@@ -75,8 +75,8 @@ def get_all_users_with_user_id(db, user_id):  # Look up all users' points by use
         )
         users = cursor.fetchall()
         return users
-    except Error as gauwuierror:
-        current_app.logger.error(f'Couldn\'t look up points for {user_id} by user_id: {gauwuierror.args[0]}')
+    except Exception as gauwuierror:
+        current_app.logger.error(f'Couldn\'t look up points for {user_id} by user_id: {gauwuierror}')
 
 
 def get_all_users(db):  # Get all users' details from points database
@@ -86,8 +86,8 @@ def get_all_users(db):  # Get all users' details from points database
         )
         users = cursor.fetchall()
         return users
-    except Error as gauerror:
-        current_app.logger.error(f'Couldn\'t get all users\' points: {gauerror.args[0]}')
+    except Exception as gauerror:
+        current_app.logger.error(f'Couldn\'t get all users\' points: {gauerror}')
 
 
 def award_chat_points(db, user_id, points):  # Award points to user by user id
@@ -98,8 +98,8 @@ def award_chat_points(db, user_id, points):  # Award points to user by user id
         )
         db.commit()
         return True
-    except Error as acperror:
-        current_app.logger.error(f'Couldn\'t give {points} points to {user_id}: {acperror.args[0]}')
+    except Exception as acperror:
+        current_app.logger.error(f'Couldn\'t give {points} points to {user_id}: {acperror}')
         return False
 
 
@@ -111,8 +111,8 @@ def set_email_code(db, user_id, reg_code):  # Set verification code
         )
         db.commit()
         return True
-    except Error as secerror:
-        current_app.logger.error(f'Couldn\'t set reg code \"{reg_code}\" for {user_id}: {secerror.args[0]}')
+    except Exception as secerror:
+        current_app.logger.error(f'Couldn\'t set reg code \"{reg_code}\" for {user_id}: {secerror}')
         return False
 
 
@@ -124,8 +124,8 @@ def del_email_code(db, user_id):  # Delete verification code
         )
         db.commit()
         return True
-    except Error as decerror:
-        current_app.logger.error(f'Couldn\'t remove reg code for {user_id}: {decerror.args[0]}')
+    except Exception as decerror:
+        current_app.logger.error(f'Couldn\'t remove reg code for {user_id}: {decerror}')
         return False
 
 
@@ -138,8 +138,8 @@ def adjust_points(db, user_id, points):  # For streamer to manually adjust a use
         db.commit()
         current_app.logger.info(f'Adjusted points for {user_id}')
         return True
-    except Error as aperror:
-        current_app.logger.error(f'Couldn\'t adjust points for {user_id}: {aperror.args[0]}')
+    except Exception as aperror:
+        current_app.logger.error(f'Couldn\'t adjust points for {user_id}: {aperror}')
         return False
 
 
@@ -151,8 +151,8 @@ def delete_user(db, user_id):
             )
         db.commit()
         return True
-    except Error as du_error:
-        current_app.logger.error(f'Couldn\'t change delete {user_id} from the database: {du_error.args[0]}')
+    except Exception as du_error:
+        current_app.logger.error(f'Couldn\'t change delete {user_id} from the database: {du_error}')
         return False
 
 
@@ -176,8 +176,8 @@ def change_email(db, user_id, new_email):  # For streamer to manually adjust a u
         )
         db.commit()
         return True
-    except Error as ce_error:
-        current_app.logger.error(f'Couldn\'t change email address for {user_id}: {ce_error.args[0]}')
+    except Exception as ce_error:
+        current_app.logger.error(f'Couldn\'t change email address for {user_id}: {ce_error}')
         return False
 
 
@@ -189,8 +189,8 @@ def spend_points(db, user_id, points):  # A user spends points on a redeem
         )
         db.commit()
         return True
-    except Error as sperror:
-        current_app.logger.error(f'Couldn\'t spend {user_id}\'s {points} points: {sperror.args[0]}')
+    except Exception as sperror:
+        current_app.logger.error(f'Couldn\'t spend {user_id}\'s {points} points: {sperror}')
         return False
 
 
@@ -204,7 +204,7 @@ def refund_points(db, user_id, points):  # Streamer refunds points for a redeem
         current_app.logger.info(f'Refunded {points} points to {user_id}.')
         return True
     except Exception as rerror:
-        current_app.logger.error(f'Couldn\'t refund {points} points for {user_id}: {rerror.args[0]}')
+        current_app.logger.error(f'Couldn\'t refund {points} points for {user_id}: {rerror}')
         return False
 
 
@@ -217,8 +217,8 @@ def user_in_points(db, user_id):  # Check if a user is in the points database
         if cursor.fetchone() is None:
             return False
         return True
-    except Error as uiperror:
-        current_app.logger.error(f'Couldn\'t for {user_id} in points database: {uiperror.args[0]}')
+    except Exception as uiperror:
+        current_app.logger.error(f'Couldn\'t for {user_id} in points database: {uiperror}')
 
 
 def add_email_to_points(db, email, points):  # Add an anonymous user and points to the database
@@ -230,8 +230,8 @@ def add_email_to_points(db, email, points):  # Add an anonymous user and points
         )
         db.commit()
         return True
-    except Error as aetperror:
-        current_app.logger.error(f'Couldn\'t add {email} to points database: {aetperror.args[0]}')
+    except Exception as aetperror:
+        current_app.logger.error(f'Couldn\'t add {email} to points database: {aetperror}')
         return False
 
 
@@ -259,8 +259,8 @@ def add_user_to_points(db, user_id, display_name, authed):  # Add a user to the
             )
         db.commit()
         return True
-    except Error as autperror:
-        current_app.logger.error(f'Couldn\'t add {user_id}/{display_name}/{authed} to database: {autperror.args[0]}')
+    except Exception as autperror:
+        current_app.logger.error(f'Couldn\'t add {user_id}/{display_name}/{authed} to database: {autperror}')
         return False
 
 
@@ -271,8 +271,8 @@ def change_name(db, user_id, new_name):  # Change a user name in the points data
             (new_name, user_id)
         )
         db.commit()
-    except Error as cnerror:
-        current_app.logger.error(f'Couldn\'t change name to {new_name} for {user_id}: {cnerror.args[0]}')
+    except Exception as cnerror:
+        current_app.logger.error(f'Couldn\'t change name to {new_name} for {user_id}: {cnerror}')
 
 
 def remove_duplicates(db, user_id, username):  # Remove duplicate usernames
@@ -282,5 +282,5 @@ def remove_duplicates(db, user_id, username):  # Remove duplicate usernames
             (username, user_id)
         )
         db.commit()
-    except Error as rderror:
-        current_app.logger.error(f'Couldn\'t remove duplicate username {username} for {user_id}: {rderror.args[0]}')
+    except Exception as rderror:
+        current_app.logger.error(f'Couldn\'t remove duplicate username {username} for {user_id}: {rderror}')

+ 3 - 0
ownchatbot/web_panels.py

@@ -718,6 +718,9 @@ def ocb_alert(alert_type):
     elif alert_type == 'GOAL_ALERT':
         return render_template('rgoal.html',
                                alert_name=alert_name)
+    elif alert_type == 'GB_ALERT':
+        return render_template('rgbdonation.html',
+                               alert_name=alert_name)
 
 
 @ocb.route('/goals', methods=['GET'])  # Goals overlay

+ 19 - 5
ownchatbot/webhooks.py

@@ -265,7 +265,7 @@ def gb_hook():
 @ocb.route('/checkFollows')  # Polled by follower.html template to check for new followers
 def check_follows():
     alerts_dict = current_app.config['ALERTS']
-    follower = {'name': alerts_dict['follower'], 'reward': 'New Follow!'}
+    follower = {'name': alerts_dict['follower']}
     if follower['name']:
         current_app.logger.info(f'New follower: \"{follower["name"]}\"')
         alerts_dict['follower'] = ''
@@ -277,10 +277,10 @@ def check_follows():
     return jsonify(None)
 
 
-@ocb.route('/checkGoals')  # Polled by ocbalert.html template to check for new followers
+@ocb.route('/checkGoals')  # Polled by rgoal.html template to check for if a goal has been passed
 def check_goals():
     alerts_dict = current_app.config['ALERTS']
-    rgoals = {'name': alerts_dict['g_name'], 'reward': 'GOAL!!'}
+    rgoals = {'name': alerts_dict['g_name']}
     if rgoals['name']:
         current_app.logger.debug(rgoals)
         alerts_dict['g_name'] = ''
@@ -292,10 +292,10 @@ def check_goals():
     return jsonify(None)
 
 
-@ocb.route('/checkMilestones')  # Polled by ocbalert.html template to check for new followers
+@ocb.route('/checkMilestones')  # Polled by rmilestone.html template to check if a milestone has been passed
 def check_milestones():
     alerts_dict = current_app.config['ALERTS']
-    rmilestones = {'name': alerts_dict['m_name'], 'reward': 'Milestone!'}
+    rmilestones = {'name': alerts_dict['m_name']}
     if rmilestones['name']:
         current_app.logger.info(rmilestones)
         alerts_dict['m_name'] = ''
@@ -305,3 +305,17 @@ def check_milestones():
     else:
         current_app.logger.debug(f'No new milestones passed')
     return jsonify(None)
+
+
+@ocb.route('/checkGBs')  # Polled by rgbdonation.html template to check for new givebutter donations
+def check_gbs():
+    alerts_dict = current_app.config['ALERTS']
+    rgbs = {'name': alerts_dict['gb_name']}
+    if rgbs['name']:
+        current_app.logger.debug(rgbs)
+        alerts_dict['gb_name'] = ''
+        save_alerts(alerts_dict)
+        return jsonify(rgbs)
+    else:
+        current_app.logger.debug(f'No GiveButter donation')
+    return jsonify(None)