The comeback
This commit is contained in:
		| @@ -1,21 +1,22 @@ | ||||
| {% load static %} | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" data-bs-theme="dark"> | ||||
|  | ||||
|     <head> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|         <meta name="description" content="Twitch drops"> | ||||
|         <meta name="author" content="TheLovinator"> | ||||
|         <meta name="keywords" content="Twitch, drops"> | ||||
|         <meta name="robots" content="index, follow"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <meta charset="utf-8" /> | ||||
|         <meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||||
|         <meta name="description" content="Twitch drops" /> | ||||
|         <meta name="author" content="TheLovinator" /> | ||||
|         <meta name="keywords" content="Twitch, drops" /> | ||||
|         <meta name="robots" content="index, follow" /> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|         <title>Twitch drops</title> | ||||
|         <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> | ||||
|         <link rel="stylesheet" href="{% static 'css/style.css' %}"> | ||||
|         <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" /> | ||||
|         <link rel="stylesheet" href="{% static 'css/style.css' %}" /> | ||||
|     </head> | ||||
|  | ||||
|     <body data-bs-spy="scroll" data-bs-target=".toc" data-bs-offset="-200" tabindex="0"> | ||||
|     <body data-bs-spy="scroll" | ||||
|           data-bs-target=".toc" | ||||
|           data-bs-offset="-200" | ||||
|           tabindex="0"> | ||||
|         {% include "partials/alerts.html" %} | ||||
|         <article class="container mt-5"> | ||||
|             {% include "partials/header.html" %} | ||||
| @@ -24,5 +25,4 @@ | ||||
|         </article> | ||||
|         <script src="{% static 'js/bootstrap.min.js' %}"></script> | ||||
|     </body> | ||||
|  | ||||
| </html> | ||||
|   | ||||
| @@ -1,106 +1,141 @@ | ||||
| {% extends "base.html" %} | ||||
|  | ||||
| {% block content %} | ||||
| <div class="container"> | ||||
|     <h2>{{ game.name }}</h2> | ||||
|     <img src="{{ game.box_art_url }}" alt="{{ game.name }} box art" height="283" width="212"> | ||||
|     <h3>Game Details</h3> | ||||
|     <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|         <tr> | ||||
|             <td><strong>Twitch ID:</strong></td> | ||||
|             <td>{{ game.pk }}</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|             <td><strong>Game URL:</strong></td> | ||||
|             <td><a href="{{ game.game_url }}" target="_blank">{{ game.game_url }}</a></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|             <td><strong>Game name:</strong></td> | ||||
|             <td>{{ game.name }}</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|             <td><strong>Game box art URL:</strong></td> | ||||
|             <td><a href="{{ game.box_art_url }}" target="_blank">{{ game.box_art_url }}</a></td> | ||||
|         </tr> | ||||
|     </table> | ||||
|     <h3>Organization</h3> | ||||
|     <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|         <tr> | ||||
|             {% if game.org %} | ||||
|             <td><a href="#">{{ game.org.name }} - | ||||
|                     <span class="text-muted">{{ game.org.pk }}</span></a></td> | ||||
|             {% else %} | ||||
|             <td>No organization associated with this game.</td> | ||||
|             {% endif %} | ||||
|         </tr> | ||||
|     </table> | ||||
|     <h3>Drop Campaigns</h3> | ||||
|     {% if game.drop_campaigns.all %} | ||||
|     {% for drop_campaign in game.drop_campaigns.all %} | ||||
|     <br> | ||||
|     <h2>{{ drop_campaign.name }}</h2> | ||||
|     <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|         <tr> | ||||
|             <td><strong>Campaign Name:</strong></td> | ||||
|             <td>{{ drop_campaign.name }}</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|             <td><img src="{{ drop_campaign.image_url }}" alt="{{ drop_campaign.name }} image"></td> | ||||
|             <td> | ||||
|                 <p><strong>Created at:</strong> | ||||
|                     {{ drop_campaign.created_at }} | ||||
|                 </p> | ||||
|                 <p><strong>Modified at:</strong> | ||||
|                     {{ drop_campaign.modified_at }} | ||||
|                 </p> | ||||
|                 <p><strong>Status:</strong> | ||||
|                     {{ drop_campaign.status }} | ||||
|                 </p> | ||||
|                 <p><strong>Description:</strong> | ||||
|                     {{ drop_campaign.description }} | ||||
|                 </p> | ||||
|                 <p><strong>Starts at:</strong> | ||||
|                     {{ drop_campaign.starts_at }} | ||||
|                 </p> | ||||
|                 <p><strong>Ends at:</strong> | ||||
|                     {{ drop_campaign.ends_at }} | ||||
|                 </p> | ||||
|                 <p><strong>More details:</strong> | ||||
|                     <a href="{{ drop_campaign.details_url }}" target="_blank">{{ drop_campaign.details_url }}</a> | ||||
|                 </p> | ||||
|                 <p><strong>Account Link:</strong> | ||||
|                     <a href="{{ drop_campaign.account_link_url }}" | ||||
|                         target="_blank">{{ drop_campaign.account_link_url }}</a> | ||||
|                 </p> | ||||
|             </td> | ||||
|         </tr> | ||||
|     </table> | ||||
|     {% if drop_campaign.drops.all %} | ||||
|     <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|         <tr> | ||||
|             <th>ID</th> | ||||
|             <th>Item Name</th> | ||||
|             <th>Minutes</th> | ||||
|             <th>Image</th> | ||||
|             <th>Benefit Name</th> | ||||
|         </tr> | ||||
|         {% for item in drop_campaign.drops.all %} | ||||
|         <tr> | ||||
|             <td>{{ item.pk }}</td> | ||||
|             <td>{{ item.name }}</td> | ||||
|             <td>{{ item.required_minutes_watched }}</td> | ||||
|             {% for benefit in item.benefits.all %} | ||||
|             <td><img src="{{ benefit.image_url }}" alt="{{ benefit.name }} reward image" height="50" width="50"></td> | ||||
|             <td>{{ benefit.name }}</td> | ||||
|     <div class="container"> | ||||
|         <h2>{{ game.name }}</h2> | ||||
|         <img src="{{ game.box_art_url }}" | ||||
|              alt="{{ game.name }} box art" | ||||
|              height="283" | ||||
|              width="212" /> | ||||
|         <h3>Game Details</h3> | ||||
|         <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|             <tr> | ||||
|                 <td> | ||||
|                     <strong>Twitch ID:</strong> | ||||
|                 </td> | ||||
|                 <td>{{ game.pk }}</td> | ||||
|             </tr> | ||||
|             <tr> | ||||
|                 <td> | ||||
|                     <strong>Game URL:</strong> | ||||
|                 </td> | ||||
|                 <td> | ||||
|                     <a href="{{ game.game_url }}" target="_blank">{{ game.game_url }}</a> | ||||
|                 </td> | ||||
|             </tr> | ||||
|             <tr> | ||||
|                 <td> | ||||
|                     <strong>Game name:</strong> | ||||
|                 </td> | ||||
|                 <td>{{ game.name }}</td> | ||||
|             </tr> | ||||
|             <tr> | ||||
|                 <td> | ||||
|                     <strong>Game box art URL:</strong> | ||||
|                 </td> | ||||
|                 <td> | ||||
|                     <a href="{{ game.box_art_url }}" target="_blank">{{ game.box_art_url }}</a> | ||||
|                 </td> | ||||
|             </tr> | ||||
|         </table> | ||||
|         <h3>Organization</h3> | ||||
|         <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|             <tr> | ||||
|                 {% if game.org %} | ||||
|                     <td> | ||||
|                         <a href="#">{{ game.org.name }} - | ||||
|                             <span class="text-muted">{{ game.org.pk }}</span></a> | ||||
|                     </td> | ||||
|                 {% else %} | ||||
|                     <td>No organization associated with this game.</td> | ||||
|                 {% endif %} | ||||
|             </tr> | ||||
|         </table> | ||||
|         <h3>Drop Campaigns</h3> | ||||
|         {% if game.drop_campaigns.all %} | ||||
|             {% for drop_campaign in game.drop_campaigns.all %} | ||||
|                 <br /> | ||||
|                 <h2>{{ drop_campaign.name }}</h2> | ||||
|                 <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|                     <tr> | ||||
|                         <td> | ||||
|                             <strong>Campaign Name:</strong> | ||||
|                         </td> | ||||
|                         <td>{{ drop_campaign.name }}</td> | ||||
|                     </tr> | ||||
|                     <tr> | ||||
|                         <td> | ||||
|                             <img src="{{ drop_campaign.image_url }}" | ||||
|                                  alt="{{ drop_campaign.name }} image" /> | ||||
|                         </td> | ||||
|                         <td> | ||||
|                             <p> | ||||
|                                 <strong>Created at:</strong> | ||||
|                                 {{ drop_campaign.created_at }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Modified at:</strong> | ||||
|                                 {{ drop_campaign.modified_at }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Status:</strong> | ||||
|                                 {{ drop_campaign.status }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Description:</strong> | ||||
|                                 {{ drop_campaign.description }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Starts at:</strong> | ||||
|                                 {{ drop_campaign.starts_at }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Ends at:</strong> | ||||
|                                 {{ drop_campaign.ends_at }} | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>More details:</strong> | ||||
|                                 <a href="{{ drop_campaign.details_url }}" target="_blank">{{ drop_campaign.details_url }}</a> | ||||
|                             </p> | ||||
|                             <p> | ||||
|                                 <strong>Account Link:</strong> | ||||
|                                 <a href="{{ drop_campaign.account_link_url }}" target="_blank">{{ drop_campaign.account_link_url }}</a> | ||||
|                             </p> | ||||
|                         </td> | ||||
|                     </tr> | ||||
|                 </table> | ||||
|                 {% if drop_campaign.drops.all %} | ||||
|                     <table class="table table-hover table-sm table-striped" cellspacing="0"> | ||||
|                         <tr> | ||||
|                             <th>ID</th> | ||||
|                             <th>Item Name</th> | ||||
|                             <th>Minutes</th> | ||||
|                             <th>Image</th> | ||||
|                             <th>Benefit Name</th> | ||||
|                         </tr> | ||||
|                         {% for item in drop_campaign.drops.all %} | ||||
|                             <tr> | ||||
|                                 <td>{{ item.pk }}</td> | ||||
|                                 <td>{{ item.name }}</td> | ||||
|                                 <td>{{ item.required_minutes_watched }}</td> | ||||
|                                 {% for benefit in item.benefits.all %} | ||||
|                                     <td> | ||||
|                                         <img src="{{ benefit.image_url }}" | ||||
|                                              alt="{{ benefit.name }} reward image" | ||||
|                                              height="50" | ||||
|                                              width="50" /> | ||||
|                                     </td> | ||||
|                                     <td>{{ benefit.name }}</td> | ||||
|                                 {% endfor %} | ||||
|                             </tr> | ||||
|                         {% endfor %} | ||||
|                     </table> | ||||
|                 {% else %} | ||||
|                     <p>No items associated with this drop campaign.</p> | ||||
|                 {% endif %} | ||||
|             {% endfor %} | ||||
|         </tr> | ||||
|         {% endfor %} | ||||
|     </table> | ||||
|     {% else %} | ||||
|     <p>No items associated with this drop campaign.</p> | ||||
|     {% endif %} | ||||
|     {% endfor %} | ||||
|     {% else %} | ||||
|     <p>No drop campaigns associated with this game.</p> | ||||
|     {% endif %} | ||||
| </div> | ||||
|         {% else %} | ||||
|             <p>No drop campaigns associated with this game.</p> | ||||
|         {% endif %} | ||||
|     </div> | ||||
| {% endblock content %} | ||||
|   | ||||
| @@ -1,34 +1,37 @@ | ||||
| {% extends "base.html" %} | ||||
|  | ||||
| {% block content %} | ||||
| <div class="container mt-4"> | ||||
|     {% for game in games %} | ||||
|     <div class="card mb-4 shadow-sm"> | ||||
|         <div class="row g-0"> | ||||
|             <div class="col-md-2"> | ||||
|                 <img src="{{ game.box_art_url }}" alt="{{ game.name }} box art" class="img-fluid rounded-start" | ||||
|                     height="283" width="212" loading="lazy"> | ||||
|             </div> | ||||
|             <div class="col-md-10"> | ||||
|                 <div class="card-body"> | ||||
|                     <h2 class="card-title h5"> | ||||
|                         <a href="https://www.twitch.tv/directory/category/{{ game.slug }}" | ||||
|                             class="text-decoration-none">{{ game.name }}</a> | ||||
|                     </h2> | ||||
|                     <div> | ||||
|                         <a href="{% url 'game' game.pk %}" class="text-decoration-none">See previous drops</a> | ||||
|     <div class="container mt-4"> | ||||
|         {% for game in games %} | ||||
|             <div class="card mb-4 shadow-sm"> | ||||
|                 <div class="row g-0"> | ||||
|                     <div class="col-md-2"> | ||||
|                         <img src="{{ game.box_art_url }}" | ||||
|                              alt="{{ game.name }} box art" | ||||
|                              class="img-fluid rounded-start" | ||||
|                              height="283" | ||||
|                              width="212" | ||||
|                              loading="lazy" /> | ||||
|                     </div> | ||||
|                     <div> | ||||
|                         <a href="" class="text-decoration-none">Subscribe to new drops</a> | ||||
|                     <div class="col-md-10"> | ||||
|                         <div class="card-body"> | ||||
|                             <h2 class="card-title h5"> | ||||
|                                 <a href="https://www.twitch.tv/directory/category/{{ game.slug }}" | ||||
|                                    class="text-decoration-none">{{ game.name }}</a> | ||||
|                             </h2> | ||||
|                             <div> | ||||
|                                 <a href="{% url 'game' game.pk %}" class="text-decoration-none">See previous drops</a> | ||||
|                             </div> | ||||
|                             <div> | ||||
|                                 <a href="" class="text-decoration-none">Subscribe to new drops</a> | ||||
|                             </div> | ||||
|                             <div> | ||||
|                                 <a href="" class="text-decoration-none">Subscribe to active drops</a> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div> | ||||
|                         <a href="" class="text-decoration-none">Subscribe to active drops</a> | ||||
|  | ||||
|                     </div> | ||||
|  | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         {% endfor %} | ||||
|     </div> | ||||
|     {% endfor %} | ||||
| </div> | ||||
| {% endblock content %} | ||||
|   | ||||
| @@ -1,176 +1,176 @@ | ||||
| {% extends "base.html" %} | ||||
| {% load static %} | ||||
| {% load custom_filters %} | ||||
| {% load time_filters %} | ||||
| {% load custom_filters static time_filters %} | ||||
| {% block content %} | ||||
| <div class="container mt-4"> | ||||
|     {% include "partials/info_box.html" %} | ||||
|     {% include "partials/news.html" %} | ||||
|  | ||||
|     <!-- Reward Campaigns Section --> | ||||
|     <section class="reward-campaigns"> | ||||
|         <h2> | ||||
|             Reward Campaigns - | ||||
|             <span class="d-inline text-muted"> | ||||
|                 {{ reward_campaigns.count }} campaign{{ reward_campaigns.count|pluralize }} | ||||
|             </span> | ||||
|         </h2> | ||||
|  | ||||
|         <!-- Loop through reward campaigns --> | ||||
|         {% for campaign in reward_campaigns %} | ||||
|         <div class="card mb-4 shadow-sm" id="campaign-{{ campaign.twitch_id }}"> | ||||
|             <div class="row g-0"> | ||||
|                 <!-- Campaign Image --> | ||||
|                 <div class="col-md-2"> | ||||
|                     <img src="{{ campaign.image_url }}" alt="{{ campaign.name }}" class="img-fluid rounded-start" | ||||
|                         height="283" width="212" loading="lazy"> | ||||
|                 </div> | ||||
|  | ||||
|                 <!-- Campaign Details --> | ||||
|                 <div class="col-md-10"> | ||||
|                     <div class="card-body"> | ||||
|                         <h2 class="card-title h5"> | ||||
|                             <a href="#campaign-{{ campaign.twitch_id }}" class="plain-text-item"> | ||||
|                                 {{ campaign.name }} | ||||
|                             </a> | ||||
|                         </h2> | ||||
|                         <p class="card-text text-muted">{{ campaign.summary }}</p> | ||||
|                         <p class="mb-2 text-muted"> | ||||
|                             Ends in: | ||||
|                             <abbr | ||||
|                                 title="{{ campaign.starts_at|date:'l d F H:i %Z' }} - {{ campaign.ends_at|date:'l d F H:i %Z' }}"> | ||||
|                                 {{ campaign.ends_at|timesince }} | ||||
|                             </abbr> | ||||
|                         </p> | ||||
|                         <a href="{{ campaign.external_url }}" class="btn btn-primary" target="_blank">Learn More</a> | ||||
|  | ||||
|                         <!-- Instructions (if any) --> | ||||
|                         {% if campaign.instructions %} | ||||
|                         <div class="mt-3"> | ||||
|                             <h3 class="h6">Instructions</h3> | ||||
|                             <p>{{ campaign.instructions|safe }}</p> | ||||
|     <div class="container mt-4"> | ||||
|         {% include "partials/info_box.html" %} | ||||
|         {% include "partials/news.html" %} | ||||
|         <!-- Reward Campaigns Section --> | ||||
|         <section class="reward-campaigns"> | ||||
|             <h2> | ||||
|                 Reward Campaigns - | ||||
|                 <span class="d-inline text-muted">{{ reward_campaigns.count }} campaign{{ reward_campaigns.count|pluralize }}</span> | ||||
|             </h2> | ||||
|             <!-- Loop through reward campaigns --> | ||||
|             {% for campaign in reward_campaigns %} | ||||
|                 <div class="card mb-4 shadow-sm" id="campaign-{{ campaign.twitch_id }}"> | ||||
|                     <div class="row g-0"> | ||||
|                         <!-- Campaign Image --> | ||||
|                         <div class="col-md-2"> | ||||
|                             <img src="{{ campaign.image_url }}" | ||||
|                                  alt="{{ campaign.name }}" | ||||
|                                  class="img-fluid rounded-start" | ||||
|                                  height="283" | ||||
|                                  width="212" | ||||
|                                  loading="lazy" /> | ||||
|                         </div> | ||||
|                         {% endif %} | ||||
|  | ||||
|                         <!-- Rewards (if any) --> | ||||
|                         {% if campaign.rewards.all %} | ||||
|                         <div class="mt-3"> | ||||
|                             <h3 class="h6">Rewards</h3> | ||||
|                             <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-2"> | ||||
|                                 {% for reward in campaign.rewards.all %} | ||||
|                                 <div class="col d-flex align-items-center position-relative"> | ||||
|                                     <img src="{{ reward.thumbnail_image_url }}" alt="{{ reward.name }} reward image" | ||||
|                                         class="img-fluid rounded me-3" height="50" width="50" loading="lazy"> | ||||
|                                     <div><strong>{{ reward.name }}</strong></div> | ||||
|                                 </div> | ||||
|                         <!-- Campaign Details --> | ||||
|                         <div class="col-md-10"> | ||||
|                             <div class="card-body"> | ||||
|                                 <h2 class="card-title h5"> | ||||
|                                     <a href="#campaign-{{ campaign.twitch_id }}" class="plain-text-item">{{ campaign.name }}</a> | ||||
|                                 </h2> | ||||
|                                 <p class="card-text text-muted">{{ campaign.summary }}</p> | ||||
|                                 <p class="mb-2 text-muted"> | ||||
|                                     Ends in: | ||||
|                                     <abbr title="{{ campaign.starts_at|date:'l d F H:i %Z' }} - {{ campaign.ends_at|date:'l d F H:i %Z' }}"> | ||||
|                                         {{ campaign.ends_at|timesince }} | ||||
|                                     </abbr> | ||||
|                                 </p> | ||||
|                                 <a href="{{ campaign.external_url }}" | ||||
|                                    class="btn btn-primary" | ||||
|                                    target="_blank">Learn More</a> | ||||
|                                 <!-- Instructions (if any) --> | ||||
|                                 {% if campaign.instructions %} | ||||
|                                     <div class="mt-3"> | ||||
|                                         <h3 class="h6">Instructions</h3> | ||||
|                                         <p>{{ campaign.instructions|safe }}</p> | ||||
|                                     </div> | ||||
|                                 {% endif %} | ||||
|                                 <!-- Rewards (if any) --> | ||||
|                                 {% if campaign.rewards.all %} | ||||
|                                     <div class="mt-3"> | ||||
|                                         <h3 class="h6">Rewards</h3> | ||||
|                                         <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-2"> | ||||
|                                             {% for reward in campaign.rewards.all %} | ||||
|                                                 <div class="col d-flex align-items-center position-relative"> | ||||
|                                                     <img src="{{ reward.thumbnail_image_url }}" | ||||
|                                                          alt="{{ reward.name }} reward image" | ||||
|                                                          class="img-fluid rounded me-3" | ||||
|                                                          height="50" | ||||
|                                                          width="50" | ||||
|                                                          loading="lazy" /> | ||||
|                                                     <div> | ||||
|                                                         <strong>{{ reward.name }}</strong> | ||||
|                                                     </div> | ||||
|                                                 </div> | ||||
|                                             {% endfor %} | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 {% endif %} | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             {% endfor %} | ||||
|         </section> | ||||
|         <!-- Drop Campaigns Section --> | ||||
|         <section class="drop-campaigns"> | ||||
|             <h2> | ||||
|                 Drop Campaigns - | ||||
|                 <span class="d-inline text-muted">{{ games.count }} game{{ games.count|pluralize }}</span> | ||||
|             </h2> | ||||
|             <!-- Loop through games --> | ||||
|             {% for game in games %} | ||||
|                 <div class="card mb-4 shadow-sm"> | ||||
|                     <div class="row g-0"> | ||||
|                         <!-- Game Box Art --> | ||||
|                         <div class="col-md-2"> | ||||
|                             <img src="{{ game.box_art_url|default:'https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg' }}" | ||||
|                                  alt="{{ game.name|default:'Game name unknown' }} box art" | ||||
|                                  class="img-fluid rounded-start" | ||||
|                                  height="283" | ||||
|                                  width="212" | ||||
|                                  loading="lazy" /> | ||||
|                         </div> | ||||
|                         <!-- Game Details --> | ||||
|                         <div class="col-md-10"> | ||||
|                             <div class="card-body"> | ||||
|                                 <h2 class="card-title h5"> | ||||
|                                     <a href="{% url 'game' game.twitch_id %}" class="text-decoration-none">{{ game.name|default:'Unknown' }}</a> | ||||
|                                     - | ||||
|                                     <a href="https://www.twitch.tv/directory/category/{{ game.slug|default:'game-name-unknown' }}" | ||||
|                                        class="text-decoration-none text-muted">Twitch</a> | ||||
|                                 </h2> | ||||
|                                 <!-- Loop through campaigns for each game --> | ||||
|                                 {% for campaign in game.drop_campaigns.all %} | ||||
|                                     <div class="mt-4"> | ||||
|                                         <h4 class="h6">{{ campaign.name }}</h4> | ||||
|                                         <a href="{{ campaign.details_url }}" class="text-decoration-none">Details</a> | ||||
|                                         {% if campaign.details_url != campaign.account_link_url %} | ||||
|                                             | <a href="{{ campaign.account_link_url }}" class="text-decoration-none">Link Account</a> | ||||
|                                         {% endif %} | ||||
|                                         <p class="mb-2 text-muted"> | ||||
|                                             Ends in: | ||||
|                                             <abbr title="{{ campaign.starts_at|date:'l d F H:i' }} - {{ campaign.ends_at|date:'l d F H:i' }}"> | ||||
|                                                 {{ campaign.ends_at|timeuntil }} | ||||
|                                             </abbr> | ||||
|                                         </p> | ||||
|                                         <!-- Drop Benefits Table --> | ||||
|                                         <div class="table-responsive"> | ||||
|                                             <table class="table table-striped table-hover align-middle"> | ||||
|                                                 <thead> | ||||
|                                                     <tr> | ||||
|                                                         <th>Benefit Image</th> | ||||
|                                                         <th>Benefit Name</th> | ||||
|                                                         <th>Required Minutes Watched</th> | ||||
|                                                     </tr> | ||||
|                                                 </thead> | ||||
|                                                 <tbody> | ||||
|                                                     {% for drop in campaign.drops.all %} | ||||
|                                                         {% if drop.benefits.exists %} | ||||
|                                                             {% for benefit in drop.benefits.all %} | ||||
|                                                                 <tr> | ||||
|                                                                     <td> | ||||
|                                                                         <img src="{{ benefit.image_url|default:'https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg' }}" | ||||
|                                                                              alt="{{ benefit.name|default:'Unknown' }}" | ||||
|                                                                              class="img-fluid rounded" | ||||
|                                                                              height="50" | ||||
|                                                                              width="50" | ||||
|                                                                              loading="lazy" /> | ||||
|                                                                     </td> | ||||
|                                                                     <td> | ||||
|                                                                         <abbr title="{{ drop.name|default:'Unknown' }}"> | ||||
|                                                                             {{ benefit.name|default:'Unknown' }} | ||||
|                                                                         </abbr> | ||||
|                                                                     </td> | ||||
|                                                                     <td>{{ drop.required_minutes_watched|minutes_to_hours }}</td> | ||||
|                                                                 </tr> | ||||
|                                                             {% endfor %} | ||||
|                                                         {% else %} | ||||
|                                                             <tr> | ||||
|                                                                 <td> | ||||
|                                                                     <img src="https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg" | ||||
|                                                                          alt="{{ drop.name|default:'Unknown' }}" | ||||
|                                                                          class="img-fluid rounded" | ||||
|                                                                          height="50" | ||||
|                                                                          width="50" | ||||
|                                                                          loading="lazy" /> | ||||
|                                                                 </td> | ||||
|                                                                 <td>{{ drop.name|default:'Unknown' }}</td> | ||||
|                                                                 <td>N/A</td> | ||||
|                                                             </tr> | ||||
|                                                         {% endif %} | ||||
|                                                     {% endfor %} | ||||
|                                                 </tbody> | ||||
|                                             </table> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 {% endfor %} | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         {% endif %} | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         {% endfor %} | ||||
|     </section> | ||||
|  | ||||
|     <!-- Drop Campaigns Section --> | ||||
|     <section class="drop-campaigns"> | ||||
|         <h2> | ||||
|             Drop Campaigns - | ||||
|             <span class="d-inline text-muted">{{ games.count }} game{{ games.count|pluralize }}</span> | ||||
|         </h2> | ||||
|  | ||||
|         <!-- Loop through games --> | ||||
|         {% for game in games %} | ||||
|         <div class="card mb-4 shadow-sm"> | ||||
|             <div class="row g-0"> | ||||
|                 <!-- Game Box Art --> | ||||
|                 <div class="col-md-2"> | ||||
|                     <img src="{{ game.box_art_url|default:'https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg' }}" | ||||
|                         alt="{{ game.name|default:'Game name unknown' }} box art" class="img-fluid rounded-start" | ||||
|                         height="283" width="212" loading="lazy"> | ||||
|                 </div> | ||||
|  | ||||
|                 <!-- Game Details --> | ||||
|                 <div class="col-md-10"> | ||||
|                     <div class="card-body"> | ||||
|                         <h2 class="card-title h5"> | ||||
|                             <a href="{% url 'game' game.twitch_id %}" class="text-decoration-none"> | ||||
|                                 {{ game.name|default:'Unknown' }} | ||||
|                             </a> | ||||
|                             - | ||||
|                             <a href="https://www.twitch.tv/directory/category/{{ game.slug|default:'game-name-unknown' }}" | ||||
|                                 class="text-decoration-none text-muted">Twitch</a> | ||||
|                         </h2> | ||||
|  | ||||
|                         <!-- Loop through campaigns for each game --> | ||||
|                         {% for campaign in game.drop_campaigns.all %} | ||||
|                         <div class="mt-4"> | ||||
|                             <h4 class="h6">{{ campaign.name }}</h4> | ||||
|                             <a href="{{ campaign.details_url }}" class="text-decoration-none">Details</a> | ||||
|                             {% if campaign.details_url != campaign.account_link_url %} | ||||
|                             | <a href="{{ campaign.account_link_url }}" class="text-decoration-none">Link Account</a> | ||||
|                             {% endif %} | ||||
|  | ||||
|                             <p class="mb-2 text-muted"> | ||||
|                                 Ends in: | ||||
|                                 <abbr | ||||
|                                     title="{{ campaign.starts_at|date:'l d F H:i' }} - {{ campaign.ends_at|date:'l d F H:i' }}"> | ||||
|                                     {{ campaign.ends_at|timeuntil }} | ||||
|                                 </abbr> | ||||
|                             </p> | ||||
|  | ||||
|                             <!-- Drop Benefits Table --> | ||||
|                             <div class="table-responsive"> | ||||
|                                 <table class="table table-striped table-hover align-middle"> | ||||
|                                     <thead> | ||||
|                                         <tr> | ||||
|                                             <th>Benefit Image</th> | ||||
|                                             <th>Benefit Name</th> | ||||
|                                             <th>Required Minutes Watched</th> | ||||
|                                         </tr> | ||||
|                                     </thead> | ||||
|                                     <tbody> | ||||
|                                         {% for drop in campaign.drops.all %} | ||||
|                                         {% if drop.benefits.exists %} | ||||
|                                         {% for benefit in drop.benefits.all %} | ||||
|                                         <tr> | ||||
|                                             <td> | ||||
|                                                 <img src="{{ benefit.image_url|default:'https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg' }}" | ||||
|                                                     alt="{{ benefit.name|default:'Unknown' }}" class="img-fluid rounded" | ||||
|                                                     height="50" width="50" loading="lazy"> | ||||
|                                             </td> | ||||
|                                             <td> | ||||
|                                                 <abbr title="{{ drop.name|default:'Unknown' }}"> | ||||
|                                                     {{ benefit.name|default:'Unknown' }} | ||||
|                                                 </abbr> | ||||
|                                             </td> | ||||
|                                             <td>{{ drop.required_minutes_watched|minutes_to_hours }}</td> | ||||
|                                         </tr> | ||||
|                                         {% endfor %} | ||||
|                                         {% else %} | ||||
|                                         <tr> | ||||
|                                             <td> | ||||
|                                                 <img src="https://static-cdn.jtvnw.net/ttv-static/404_boxart.jpg" | ||||
|                                                     alt="{{ drop.name|default:'Unknown' }}" class="img-fluid rounded" | ||||
|                                                     height="50" width="50" loading="lazy"> | ||||
|                                             </td> | ||||
|                                             <td>{{ drop.name|default:'Unknown' }}</td> | ||||
|                                             <td>N/A</td> | ||||
|                                         </tr> | ||||
|                                         {% endif %} | ||||
|                                         {% endfor %} | ||||
|                                     </tbody> | ||||
|                                 </table> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         {% endfor %} | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         {% endfor %} | ||||
|     </section> | ||||
| </div> | ||||
|             {% endfor %} | ||||
|         </section> | ||||
|     </div> | ||||
| {% endblock content %} | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| {% for message in messages %} | ||||
| <div class="alert alert-dismissible {{ message.tags }} fade show" role="alert"> | ||||
|     <div>{{ message | safe }}</div> | ||||
|     <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> | ||||
| </div> | ||||
|     <div class="alert alert-dismissible {{ message.tags }} fade show" | ||||
|          role="alert"> | ||||
|         <div>{{ message|safe }}</div> | ||||
|         <button type="button" | ||||
|                 class="btn-close" | ||||
|                 data-bs-dismiss="alert" | ||||
|                 aria-label="Close"></button> | ||||
|     </div> | ||||
| {% endfor %} | ||||
|   | ||||
| @@ -1,50 +1,53 @@ | ||||
| {% if webhooks %} | ||||
| <div class="card mb-4 shadow-sm" id="info-box"> | ||||
|     <div class="row g-0"> | ||||
|         <div class="col-md-10"> | ||||
|             <div class="card-body"> | ||||
|                 <h2 class="card-title h2">Site news</h2> | ||||
|                 <div class="mt-auto"> | ||||
|                     {% for webhook in webhooks %} | ||||
|                     <div class="mt-3"> | ||||
|                         <img src="{{ webhook.avatar }}?size=32" alt="{{ webhook.name }}" class="rounded-circle" | ||||
|                             height="32" width="32"> | ||||
|                         <a href="{{ webhook.url }}" target="_blank">{{ webhook.name }}</a> | ||||
|                         <div class="form-check form-switch"> | ||||
|                             <input class="form-check-input" type="checkbox" id="new-drop-switch-daily"> | ||||
|                             <label class="form-check-label" for="new-drop-switch-daily">Daily notification of newly | ||||
|                                 added games to TTVdrops</label> | ||||
|                         </div> | ||||
|                         <div class="form-check form-switch"> | ||||
|                             <input class="form-check-input" type="checkbox" id="new-drop-switch-weekly"> | ||||
|                             <label class="form-check-label" for="new-drop-switch-weekly"> | ||||
|                                 Weekly notification of newly added games to TTVdrops | ||||
|                             </label> | ||||
|                         </div> | ||||
|                         <br> | ||||
|                         <div class="form-check form-switch"> | ||||
|                             <input class="form-check-input" type="checkbox" id="new-org-switch-daily"> | ||||
|                             <label class="form-check-label" for="new-org-switch-daily"> | ||||
|                                 Daily notification of newly added <abbr | ||||
|                                     title="Organizations are the companies that own the games.">organizations</abbr> to | ||||
|                                 TTVdrops | ||||
|                             </label> | ||||
|                         </div> | ||||
|                         <div class="form-check form-switch"> | ||||
|                             <input class="form-check-input" type="checkbox" id="new-org-switch-weekly"> | ||||
|                             <label class="form-check-label" for="new-org-switch-weekly"> | ||||
|                                 Weekly notification of newly added <abbr | ||||
|                                     title="Organizations are the companies that own the games.">organizations</abbr> to | ||||
|                                 TTVdrops | ||||
|                             </label> | ||||
|                         </div> | ||||
|     <div class="card mb-4 shadow-sm" id="info-box"> | ||||
|         <div class="row g-0"> | ||||
|             <div class="col-md-10"> | ||||
|                 <div class="card-body"> | ||||
|                     <h2 class="card-title h2">Site news</h2> | ||||
|                     <div class="mt-auto"> | ||||
|                         {% for webhook in webhooks %} | ||||
|                             <div class="mt-3"> | ||||
|                                 <img src="{{ webhook.avatar }}?size=32" | ||||
|                                      alt="{{ webhook.name }}" | ||||
|                                      class="rounded-circle" | ||||
|                                      height="32" | ||||
|                                      width="32" /> | ||||
|                                 <a href="{{ webhook.url }}" target="_blank">{{ webhook.name }}</a> | ||||
|                                 <div class="form-check form-switch"> | ||||
|                                     <input class="form-check-input" type="checkbox" id="new-drop-switch-daily" /> | ||||
|                                     <label class="form-check-label" for="new-drop-switch-daily"> | ||||
|                                         Daily notification of newly | ||||
|                                         added games to TTVdrops | ||||
|                                     </label> | ||||
|                                 </div> | ||||
|                                 <div class="form-check form-switch"> | ||||
|                                     <input class="form-check-input" type="checkbox" id="new-drop-switch-weekly" /> | ||||
|                                     <label class="form-check-label" for="new-drop-switch-weekly"> | ||||
|                                         Weekly notification of newly added games to TTVdrops | ||||
|                                     </label> | ||||
|                                 </div> | ||||
|                                 <br /> | ||||
|                                 <div class="form-check form-switch"> | ||||
|                                     <input class="form-check-input" type="checkbox" id="new-org-switch-daily" /> | ||||
|                                     <label class="form-check-label" for="new-org-switch-daily"> | ||||
|                                         Daily notification of newly added <abbr title="Organizations are the companies that own the games.">organizations</abbr> to | ||||
|                                         TTVdrops | ||||
|                                     </label> | ||||
|                                 </div> | ||||
|                                 <div class="form-check form-switch"> | ||||
|                                     <input class="form-check-input" type="checkbox" id="new-org-switch-weekly" /> | ||||
|                                     <label class="form-check-label" for="new-org-switch-weekly"> | ||||
|                                         Weekly notification of newly added <abbr title="Organizations are the companies that own the games.">organizations</abbr> to | ||||
|                                         TTVdrops | ||||
|                                     </label> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         {% endfor %} | ||||
|                     </div> | ||||
|                     {% endfor %} | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| {% else %} | ||||
| <p class="text-muted">No webhooks added yet.</p> | ||||
|     <p class="text-muted">No webhooks added yet.</p> | ||||
| {% endif %} | ||||
|   | ||||
| @@ -1,14 +1,12 @@ | ||||
| {% extends "base.html" %} | ||||
| {% load static %} | ||||
| {% load campaign_tags %} | ||||
| {% load game_tags %} | ||||
| {% load campaign_tags game_tags static %} | ||||
| {% block content %} | ||||
| <div class="container mt-4"> | ||||
|     <div class="row"> | ||||
|         <h2>Reward Campaigns</h2> | ||||
|         {% for campaign in reward_campaigns %} | ||||
|         {% render_campaign campaign %} | ||||
|         {% endfor %} | ||||
|     <div class="container mt-4"> | ||||
|         <div class="row"> | ||||
|             <h2>Reward Campaigns</h2> | ||||
|             {% for campaign in reward_campaigns %} | ||||
|                 {% render_campaign campaign %} | ||||
|             {% endfor %} | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| {% endblock content %} | ||||
|   | ||||
| @@ -1,42 +0,0 @@ | ||||
| {% extends "base.html" %} | ||||
| {% block content %} | ||||
| <div class="container"> | ||||
|     <h1 class="my-4">Add Discord Webhook</h1> | ||||
|     <div class="card card-body mb-3"> | ||||
|         Webhooks will be saved in a cookie and will be sent to the server when you subscribe to a drop. | ||||
|     </div> | ||||
|     <div> | ||||
|         <form method="post" class="needs-validation" novalidate> | ||||
|             {% csrf_token %} | ||||
|             {{ form.non_field_errors }} | ||||
|             <div class="mb-3"> | ||||
|                 {{ form.webhook_url.errors }} | ||||
|                 <label for="{{ form.webhook_url.id_for_label }}" class="form-label">{{ form.webhook_url.label }}</label> | ||||
|                 <input type="url" name="webhook_url" required="" class="form-control" | ||||
|                     aria-describedby="id_webhook_url_helptext" id="id_webhook_url"> | ||||
|                 <div class="form-text text-muted">{{ form.webhook_url.help_text }}</div> | ||||
|             </div> | ||||
|             <button type="submit" class="btn btn-primary">Add Webhook</button> | ||||
|         </form> | ||||
|     </div> | ||||
|     <h2 class="mt-5">Webhooks</h2> | ||||
|     {% if webhooks %} | ||||
|     <div class="list-group"> | ||||
|         {% for webhook in webhooks %} | ||||
|         <div class="list-group-item d-flex justify-content-between align-items-center"> | ||||
|             <span> | ||||
|                 {% if webhook.avatar %} | ||||
|                 <img src="https://cdn.discordapp.com/avatars/{{ webhook.id }}/a_{{ webhook.avatar }}.png" | ||||
|                     alt="Avatar of {{ webhook.name }}" class="rounded-circle" height="32" width="32"> | ||||
|                 {% endif %} | ||||
|                 <a href="https://discord.com/api/webhooks/{{ webhook.id }}/{{ webhook.token }}" target="_blank" | ||||
|                     class="text-decoration-none">{{ webhook.name }}</a> | ||||
|             </span> | ||||
|         </div> | ||||
|         {% endfor %} | ||||
|     </div> | ||||
|     {% else %} | ||||
|     <div class="alert alert-info">No webhooks added</div> | ||||
|     {% endif %} | ||||
| </div> | ||||
| {% endblock content %} | ||||
		Reference in New Issue
	
	Block a user