Skip to content

Commit

Permalink
Added "score" mechanism to recommend kicks/demotions
Browse files Browse the repository at this point in the history
  • Loading branch information
AaronTraas committed Jan 3, 2019
1 parent b1eeb2b commit eeee0e3
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 27 deletions.
2 changes: 1 addition & 1 deletion crtools/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.3.1"
__version__ = "1.4.0"
59 changes: 49 additions & 10 deletions crtools/crtools.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
__docformat__ = 'reStructuredText'

import codecs
from datetime import datetime
from datetime import datetime, date
from jinja2 import Environment, PackageLoader, select_autoescape
import json
import os
Expand Down Expand Up @@ -85,8 +85,8 @@ def member_warlog(member_tag, warlog):
member_warlog.append(participation)
return member_warlog

def member_danger(member, member_warlog):
good = ok = bad = 0
def member_rating(member, member_warlog, days_from_donation_reset):
good = ok = bad = na = 0
for war in member_warlog:
if war != None:
if war['status'] == 'good':
Expand All @@ -95,13 +95,20 @@ def member_danger(member, member_warlog):
ok += 1
elif war['status'] == 'bad':
bad += 1
else:
na += 1

# then calculate score based on based on 20/day. We exempt them the first day
donation_score = 0;
if days_from_donation_reset > 1:
target_donations = 12 * (days_from_donation_reset - 1)
donation_score = member['donations'] - target_donations

if bad > good:
return True
if good == 0 and member['donations'] == 0:
return True
# bigger penalty for 0 donations
if member['donations'] == 0:
donation_score -= (days_from_donation_reset - 1) * 10;

return False
return (good * 20) + (ok) + (bad * -30) + (na * -1) + donation_score

def render_dashboard(env, members, clan_name, clan_id, clan_description, clan_min_trophies, clan_stats, war_dates):
"""Render clan dashboard."""
Expand All @@ -113,14 +120,25 @@ def render_dashboard(env, members, clan_name, clan_id, clan_description, clan_mi
war_dates = war_dates
)

members_by_score = newlist = sorted(members, key=lambda k: k['rating'])

suggestions = [];
for index, member in enumerate(members_by_score):
if member['rating'] < 0:
if index < len(members) - 46:
suggestions.append('Kick <strong>{}</strong> (score: {})'.format(member['name'], member['rating']))
elif member['role'] != 'member':
suggestions.append('Demote <strong>{}</strong> (score: {})'.format(member['name'], member['rating']))

return env.get_template('page.html.j2').render(
version = __version__,
page_title = clan_name + "Clan Dashboard",
update_date = datetime.now().strftime('%c'),
content = member_table,
member_table = member_table,
clan_name = clan_name,
clan_id = clan_id,
clan_description = clan_description,
suggestions = suggestions,
clan_stats = clan_stats
)

Expand Down Expand Up @@ -176,12 +194,33 @@ def build_dashboard(api_key, clan_id, logo_path, favicon_path, description_path,
warlog = get_warlog(api_key, clan_id)
write_object_to_file(os.path.join(log_path, 'warlog.json'), json.dumps(warlog, indent=4))

# calculate the number of days since the donation last sunday, for donation tracking purposes:
today = date.today().toordinal()
sunday = today - (today % 7)
days_from_donation_reset = today - sunday

# grab importent fields from member list for dashboard
member_dash = []
for member in clan['memberList']:
member_row = member

member['donation_status'] = 'normal'
if member['donations'] > (days_from_donation_reset) * 40:
member['donation_status'] = 'good'
if days_from_donation_reset > 1:
if member['donations'] == 0:
member['donation_status'] = 'bad'
elif member['donations'] < (days_from_donation_reset-1) * 10:
member['donation_status'] = 'ok'

member_row['warlog'] = member_warlog(member['tag'], warlog)
member_row['danger'] = member_danger(member, member_row['warlog'])

member_row['rating'] = member_rating(member, member_row['warlog'], days_from_donation_reset)
if member_row['rating'] > 0:
member_row['danger'] = False
else:
member_row['danger'] = True

if member['role'] == 'leader' or member['role'] == 'coLeader':
member_row['leadership'] = True
else:
Expand Down
12 changes: 9 additions & 3 deletions crtools/static/crtools.css
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@ html, body {

main {
background-color: #f2f2f2;
overflow-x: scroll;
}

main > article, header > .inner, footer > .inner {
main > section, header > .inner, footer > .inner {
padding: 15px;
}

Expand Down Expand Up @@ -234,9 +233,16 @@ body > header h1 em {
}
}

#members article {
background-color: #fff;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.2);
padding: 15px;
margin: 8px 0 22px 0;
}

/* Member table
–––––––––––––––––––––––––––––––––––––––––––––––––– */
#members h2 {
#members h2, #members h3, #members h4 {
margin: 0;
}

Expand Down
11 changes: 3 additions & 8 deletions crtools/templates/member-table.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</thead>
<tbody>
{% for member in members %}
<tr data-danger="{{member.danger}}" data-leadership="{{member.leadership}}">
<tr data-rating="{{member.rating}}" data-danger="{{member.danger}}" data-leadership="{{member.leadership}}">
<td style="text-align: center">
{% if member.clanRank < member.previousClanRank %}
<span class="rank-up">
Expand All @@ -33,6 +33,7 @@
<div><dt>Name</dt><dd>{{member.name}}</dd></div>
<div><dt>Tag</dt><dd>{{member.tag}}</dd></div>
<div><dt>Clan Role</dt><dd>{{member.role}}</dd></div>
<div><dt>Clan Score</dt><dd>{{member.rating}}</dd></div>
<div><dt>XP Level</dt><dd>{{member.expLevel}}</dd></div>
<div><dt>Trophies</dt><dd>{{member.trophies}}</dd></div>
<div>
Expand All @@ -57,13 +58,7 @@
{% endif %}
<strong>{{member.trophies}}</strong>
</td>
{% if member.donations == 0 %}
<td class="donations bad">
{% elif member.donations > 300 %}
<td class="donations good">
{% else %}
<td class="donations">
{% endif %}
<td class="donations {{member.donation_status}}">
<strong>{{member.donations}}</strong>
</td>
{% for war in member.warlog %}
Expand Down
30 changes: 25 additions & 5 deletions crtools/templates/page.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<h1>{{clan_name}} Clan Dashboard</h1>
</div></header>
<main>
<article id="hero">
<section id="hero">
<div id="clan-description">
{{clan_description}}
</div>
Expand All @@ -27,8 +27,8 @@
{{clan_stats}}
</div>
</div>
</article>
<article id="members">
</section>
<section id="members">
<header>
<div class="labels">
<h2>Member list and stats</h2>
Expand All @@ -45,8 +45,28 @@
</label>
</div>
</header>
{{content}}
</article>
<article>
{{member_table}}
</article>

<h3 id="suggestions">Suggested actions for leadership:</h3>
<article>
<ul>
{% for suggestion in suggestions %}
<li>{{suggestion}}</li>
{% endfor %}
</ul>
<p>
Score for each individual is derived from war participation and
donations. Anyone with a score below 0 will be recommended for
kicking and demotion, depending on the number of people in the clan.
</p>
<p>
If you want to stay off this list, donate at least <strong>10 cards per
day,</strong> and participate fully in <strong>1 out of every 10 wars</strong>.
</p>
</article>
</section>
</main>

<footer><div class="inner">
Expand Down

0 comments on commit eeee0e3

Please sign in to comment.