Ver Fonte

Got milestones fully functional

allens há 3 semanas atrás
pai
commit
f7e88b569a

+ 4 - 1
ownchatbot/bot_messages.py

@@ -1,7 +1,7 @@
 from flask import current_app
 from ownchatbot.db import get_db, is_cool
 from ownchatbot.owncast_com import send_chat
-from ownchatbot.reward_handlers import run_script, add_to_queue, add_to_vote, add_to_goal, was_goal_reached, goal_reached, is_reward_active, check_vote, all_active_goals, goal_left
+from ownchatbot.reward_handlers import run_script, add_to_queue, add_to_vote, add_to_goal, was_goal_reached, goal_reached, is_reward_active, check_vote, all_active_goals, goal_left, was_milestone_reached
 from ownchatbot.user_handlers import spend_points, get_users_points, refund_points, get_all_users_with_user_id
 import os
 
@@ -72,6 +72,9 @@ def do_reward(message, user_id):  # Parse the chat command
             send_chat(f'{username}, you can\'t contribute zero points.')
         elif add_to_goal(db, user_id, reward, int(contribution)):
             send_chat(f'{username} contributed {porps(contribution)} to the \"{prefix}{reward}\" goal.')
+            wmr = was_milestone_reached(db, reward)
+            if wmr:
+                send_chat(f'{wmr} milestone reached!')
             if was_goal_reached(db, reward):
                 send_chat(f'\"{prefix}{reward}\" target reached! 🎉')
         else:

+ 2 - 2
ownchatbot/db.py

@@ -289,7 +289,7 @@ def reread_goals():  # Reread goals from rewards.py, and sync with database
                 result = cursor.fetchone()
                 if result is None:  # If it isn't, add it
                     cursor.execute(
-                        "INSERT INTO goals(name, progress, target, info, complete) VALUES(?, 0, ?, ?, FALSE)",
+                        "INSERT INTO goals(name, progress, target, info, complete, milestones) VALUES(?, 0, ?, ?, FALSE, 0)",
                         (reward, details['target'], details['info'])
                     )
                 elif result != details['target']:  # If it is, update the target
@@ -314,7 +314,7 @@ def reset_goal(goal):  # Set goal progress back to zero
         info = current_app.config['REWARDS'][goal]['info']
         cursor = db.cursor()
         cursor.execute(
-                        "UPDATE goals SET progress = 0, target = ?, complete = FALSE, info = ? WHERE name = ?",
+                        "UPDATE goals SET progress = 0, target = ?, complete = FALSE, info = ?, milestones = 0 WHERE name = ?",
                         (target, info, goal)
                     )
         db.commit()

+ 61 - 7
ownchatbot/reward_handlers.py

@@ -19,7 +19,7 @@ def check_vote(db, vote_name, user_id):  # Check if user has already voted on th
         )
         row = cursor.fetchone()
         if row is None:
-            current_app.logger.warning(f'\"{vote_name}\" not found in vote table.')
+            current_app.logger.error(f'\"{vote_name}\" not found in vote table.')
             return False
         if row[0] == user_id:
             return True
@@ -36,7 +36,7 @@ def add_to_vote(db, vote_name, user_id):  # Add a count to a vote
         )
         vote = cursor.fetchone()
         if vote is None:
-            current_app.logger.warning(f'{vote_name} not found in vote table.')
+            current_app.logger.error(f'{vote_name} not found in vote table.')
             return False
         else:  # If vote exists, add a count
             db.execute(
@@ -80,7 +80,7 @@ def add_to_goal(db, user_id, reward_name, points_contributed):  # Add a contribu
         )
         row = cursor.fetchone()
         if row is None:
-            current_app.logger.warning(f'\"{reward_name}\" not found in goal table.')
+            current_app.logger.error(f'\"{reward_name}\" not found in goal table.')
             return False
         progress, target = row
         if progress + points_contributed > target:
@@ -107,7 +107,7 @@ def goal_left(db, reward_name):
         )
         row = cursor.fetchone()
         if row is None:
-            current_app.logger.warning(f'{reward_name} not found in Goal table.')
+            current_app.logger.error(f'{reward_name} not found in Goal table.')
         else:
             progress, target = row
             left = target - progress
@@ -124,7 +124,7 @@ def goal_reached(db, reward_name):  # Set a goal as completed
         )
         row = cursor.fetchone()
         if row is None:
-            current_app.logger.warning(f'{reward_name} not found in goal table.')
+            current_app.logger.error(f'{reward_name} not found in goal table.')
         else:
             return row[0]
     except Error as grerror:
@@ -132,6 +132,60 @@ def goal_reached(db, reward_name):  # Set a goal as completed
         return False
 
 
+def was_milestone_reached(db, reward_name):  # Check if a milestone was reached
+    try:
+        all_rewards = current_app.config['REWARDS']  # Get milestone numbers from REWARDS
+        milestones_info = all_rewards[reward_name]['milestones']
+        
+        if milestones_info['milestone1'][1]:
+            ms1_goal = milestones_info['milestone1'][1]
+            ms1_reward = f'🚩 \"{milestones_info["milestone1"][0]}\"'
+        if milestones_info['milestone2'][1]:
+            ms2_goal = milestones_info['milestone2'][1]
+            ms2_reward = f'🚩🚩 \"{milestones_info["milestone2"][0]}\"'
+        if milestones_info['milestone3'][1]:
+            ms3_goal = milestones_info['milestone3'][1]
+            ms3_reward = f'🚩🚩🚩 \"{milestones_info["milestone3"][0]}\"'
+        
+        cursor = db.execute(
+            "SELECT progress, milestones FROM goals WHERE name = ?",
+            (reward_name,)
+        )  # Get progress and milestones info from database
+        row = cursor.fetchone()
+        
+        if row is None:
+            current_app.logger.error(f'{reward_name} not found in Goal table.')
+        else:
+            progress = int(row['progress'])
+            milestones = int(row['milestones'])
+            
+            if progress >= ms1_goal and progress < ms2_goal:
+                new_milestones = 1
+                ms_reward = ms1_reward
+            elif progress >= ms2_goal and progress < ms3_goal:
+                new_milestones = 2
+                ms_reward = ms2_reward
+            elif progress >= ms3_goal:
+                new_milestones = 3
+                ms_reward = ms3_reward
+            else:
+                new_milestones = 0
+                
+            if new_milestones > milestones:  # If we're passing a milestone, get the reward
+                cursor = db.execute(
+                    "UPDATE goals SET milestones = ? WHERE name = ?",
+                    (new_milestones, reward_name)
+                )
+                db.commit()
+                return ms_reward
+            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]}')
+        return False
+
+
 def was_goal_reached(db, reward_name):  # Check if a goal was reached
     try:
         cursor = db.execute(
@@ -140,7 +194,7 @@ def was_goal_reached(db, reward_name):  # Check if a goal was reached
         )
         row = cursor.fetchone()
         if row is None:
-            current_app.logger.warning(f'{reward_name} not found in Goal table.')
+            current_app.logger.error(f'{reward_name} not found in Goal table.')
         else:
             progress, target = row
             if progress == target:
@@ -204,7 +258,7 @@ def all_active_votes(db):  # Get only active votes
 def all_goals(db):  # Get all the goals
     try:
         cursor = db.execute(
-            """SELECT name, progress, target, info FROM goals"""
+            "SELECT name, progress, target, info FROM goals"
         )
         return cursor.fetchall()
     except Error as agerror:

+ 2 - 1
ownchatbot/schema.sql

@@ -17,7 +17,8 @@ CREATE TABLE goals (
   progress INTEGER NOT NULL,
   target INTEGER NOT NULL,
   complete BOOLEAN NOT NULL,
-  info TEXT
+  info TEXT,
+  milestones INTEGER
 );
 
 CREATE TABLE votes (

+ 15 - 2
ownchatbot/templates/goals.html

@@ -31,8 +31,21 @@
                 <tr>
                     <td style="text-align: left;"> {{ goal[3] }} </td>
                     {% set progress = goal[1] / goal[2] * 100 %}
-                    <td><div class="bar-light-grey bar-tiny bar-round">
-                            <div class="bar-round bar-blue" style="text-align: center; width:{{ goal[1] / goal[2] * 100 }}%;">{{ '%0.0f'| format(progress| float) }}%</div>
+                    <td>
+                        <div class="bar-light-grey bar-tiny bar-round" style="position: relative;">
+                            <div class="bar-round bar-blue" style="text-align: center; width:{{ progress }}%;">{{ '%0.0f'| format(progress| float) }}%
+                            </div>
+                            {% set milestones = rewards[goal[0]]["milestones"] %}
+                            {% for milestone_key, milestone in milestones.items() %}
+                                {% if milestones[milestone_key][0] and milestones[milestone_key][1] %}
+                                    {% if milestones[milestone_key][1] < goal[2] %}
+                                        {% set milestone_progress = milestones[milestone_key][1] / goal[2] * 100 %}
+                                            <div class="milestone-marker" style="position: absolute; left: {{ milestone_progress }}%; transform: translateX(-50%);">
+                                                <img src="/static/img/milestone.png" style="width: 16px; height: 16px;" title="{{ milestones[milestone_key][1] }} points. {{ milestones[milestone_key][0] }}">
+                                            </div>
+                                        {% endif %}
+                                    {% endif %}
+                                {% endfor %}
                         </div>
                     </td>
                     {% if goal[1] == goal[2] %}

+ 1 - 1
ownchatbot/templates/mgmt.html

@@ -104,7 +104,7 @@
                         <td>
                         </td>
                         <td style="font-size: small;">
-                            (Hover over flags for details)
+                            (Mouse over flags for details)
                         </td>
                     </tr>
                 </tbody>

+ 25 - 2
ownchatbot/templates/userpanel.html

@@ -23,6 +23,7 @@
             <li><u>Redeems</u> are standard stream point redeems. They get added to the queue for the streamer to fulfill.</li>
             <li><u>Votes</u> are just that, votes. You vote on them.</li>
             <li><u>Goals</u> are rewards that everyone in chat can contribute to. The streamer fulfills the reward when the goal is reached.</li>
+            <li><u>Milestones</u> are smaller goals inside a goal, to celebrate and/or reward progress toward the larger goal.</li>
         </ul>
         <h4>Chat commands</h4>
         <ul>
@@ -133,8 +134,23 @@
                         <td> {{ prefix }}{{ goal[0] }} </td>
                         <td> {{ goal[3] }} </td>
                         {% set progress = goal[1] / goal[2] * 100 %}
-                        <td><div class="bar-light-grey bar-tiny bar-round">
-                            <div class="bar-round bar-blue" style="text-align: center; width:{{ goal[1] / goal[2] * 100 }}%;">{{ '%0.0f'| format(progress| float) }}%</div></td>
+                        <td>
+                            <div class="bar-light-grey bar-tiny bar-round" style="position: relative;">
+                                <div class="bar-round bar-blue" style="text-align: center; width:{{ progress }}%;">{{ '%0.0f'| format(progress| float) }}%
+                                </div>
+                                {% set milestones = rewards[goal[0]]["milestones"] %}
+                                {% for milestone_key, milestone in milestones.items() %}
+                                    {% if milestones[milestone_key][0] and milestones[milestone_key][1] %}
+                                        {% if milestones[milestone_key][1] < goal[2] %}
+                                            {% set milestone_progress = milestones[milestone_key][1] / goal[2] * 100 %}
+                                                <div class="milestone-marker" style="position: absolute; left: {{ milestone_progress }}%; transform: translateX(-50%);">
+                                                    <img src="/static/img/milestone.png" style="width: 16px; height: 16px;" title="{{ milestones[milestone_key][1] }} points. {{ milestones[milestone_key][0] }}">
+                                                </div>
+                                            {% endif %}
+                                        {% endif %}
+                                    {% endfor %}
+                            </div>
+                        </td>
                         {% if goal[1] == goal[2] %}
                         <td>   {{ goal[1] }} / {{ goal[2] }} <img src=/static/img/tada.png style="width: 24px; height: 24px;"></td>
                         {% else %}
@@ -142,6 +158,13 @@
                         {% endif %}
                     </tr>
                 {% endfor %}
+                    <tr style="border-bottom: none;">
+                        <td></td>
+                        <td></td>
+                        <td style="font-size: small;">
+                            (Mouse over flags for details)
+                        </td>
+                    </tr>
                 </tbody>
             </table>
             {% else %}

+ 1 - 1
ownchatbot/update_db.sql

@@ -1,2 +1,2 @@
 ALTER TABLE points ADD COLUMN email TEXT;
-
+ALTER TABLE goals ADD COLUMN milestones INTEGER;

+ 8 - 5
ownchatbot/web_panels.py

@@ -140,11 +140,14 @@ def edit_account(user_id):
         newpoints = request.form['newpoints']
         adjust_points(db, user_id, newpoints)
         newemail = request.form['newemail']
-        if change_email(db, user_id, newemail):
-            if newemail == '':
-                current_app.logger.info(f'Removed {name}\'s email')
-            else:
-                current_app.logger.info(f'Changed {name}\'s email to {newemail}')
+        if newemail == 'None':
+            current_app.logger.info(f'No email change requested')
+        else:
+            if change_email(db, user_id, newemail):
+                if newemail == '':
+                    current_app.logger.info(f'Removed {name}\'s email')
+                else:
+                    current_app.logger.info(f'Changed {name}\'s email to {newemail}')
         return redirect(url_for('web_panels.mgmt', auth=session['auth_code']))
 
     return render_template('edit_account.html',

+ 3 - 2
ownchatbot/webhooks.py

@@ -3,7 +3,7 @@ from ownchatbot.db import get_db
 from ownchatbot.owncast_com import send_chat
 from ownchatbot.user_handlers import add_user_to_points, change_name, get_users_points, remove_duplicates
 from ownchatbot.bot_messages import do_reward, help_message
-from ownchatbot.reward_handlers import all_active_goals, all_active_votes
+from ownchatbot.reward_handlers import all_active_goals, all_active_votes, all_active_rewards
 from ownchatbot.kofi_handlers import accept_donation
 import json
 
@@ -131,7 +131,8 @@ def chat_hook():
 def goals():
     db = get_db()
     return render_template('goals.html',
-                           goals=all_active_goals(db))
+                           goals=all_active_goals(db),
+                           rewards=all_active_rewards())
 
 
 @ocb.route('/votes', methods=['GET'])  # Route for votes overlay

BIN
screenshots/userpanel01.png