Passed
Push — master ( d83fa0...73c582 )
by manny
02:10
created

gadgets.coop.Coop.set_text_if_three_finishers()   B

Complexity

Conditions 6

Size

Total Lines 18
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 18
dl 0
loc 18
rs 8.5666
c 0
b 0
f 0
cc 6
nop 6
1
import logging
2
from datetime import datetime, timedelta, timezone
3
4
from models.race import Entrant, Race
5
6
from .timer import Timer
7
8
9
class Coop:
10
    logger: logging.Logger = logging.Logger("racetime-obs")
11
    enabled = False
12
    partner = None
13
    opponent2 = None
14
    opponent1 = None
15
    source = None
16
    label_source = None
17
    text = " "
18
    label_text = "Race still in progress"
19
20
    def update_coop_text(self, race: Race, full_name):
21
        entrant = race.get_entrant_by_name(full_name)
22
        partner = race.get_entrant_by_name(self.partner)
23
        opponent1 = race.get_entrant_by_name(self.opponent1)
24
        opponent2 = race.get_entrant_by_name(self.opponent2)
25
26
        if not self.enabled or entrant is None or partner is None or opponent1 is None or opponent2 is None:
27
            return
28
29
        self.logger.debug(f"use_coop: {self.enabled}")
30
        self.logger.debug(f"entrant name: {full_name}, entrant: {entrant}")
31
        self.logger.debug(f"entrant name: {self.partner}, entrant: {partner}")
32
        self.logger.debug(
33
            f"entrant name: {self.opponent1}, entrant: {opponent1}")
34
        self.logger.debug(
35
            f"entrant name: {self.opponent2}, entrant: {opponent2}")
36
37
        our_total, opponent_total = self.get_coop_times(
38
            entrant, partner, opponent1, opponent2)
39
        self.set_text_if_two_finishers(race, our_total, opponent_total)
40
        self.set_text_if_three_finishers(
41
            race, entrant, partner, opponent1, opponent2)
42
        self.set_text_if_four_finishers(
43
            race, entrant, partner, opponent1, opponent2)
44
45
    def set_text_if_four_finishers(self, race, entrant, partner, opponent1, opponent2):
46
        if race.entrants_count_finished == 4:
47
            our_total = entrant.finish_time + partner.finish_time
48
            opponent_total = opponent1.finish_time + opponent2.finish_time
49
            if our_total < opponent_total:
50
                self.label_text = "We won!!! Average time:"
51
                self.text = Timer.timer_to_str(our_total / 2)
52
            else:
53
                self.label_text = "Opponents won, average time:"
54
                self.text = Timer.timer_to_str(opponent_total / 2)
55
56
    def set_text_if_three_finishers(self, race, entrant, partner, opponent1, opponent2):
57
        if race.entrants_count_finished == 3:
58
            current_timer = datetime.now(timezone.utc) - race.started_at
59
            if not entrant.finish_time:
60
                self.label_text, self.text = self.get_coop_text(
61
                    "I need ", partner, opponent1, opponent2, current_timer)
62
            elif not partner.finish_time:
63
                prefix = partner.user.name + " needs "
64
                self.label_text, self.text = self.get_coop_text(
65
                    prefix, entrant, opponent1, opponent2, current_timer)
66
            elif not opponent1.finish_time:
67
                prefix = opponent1.user.name + " needs "
68
                self.label_text, self.text = self.get_coop_text(
69
                    prefix, opponent2, entrant, partner, current_timer)
70
            elif not opponent2.finish_time:
71
                prefix = opponent2.user.name + " needs "
72
                self.label_text, self.text = self.get_coop_text(
73
                    prefix, opponent1, entrant, partner, current_timer)
74
75
    def set_text_if_two_finishers(self, race, our_total, opponent_total):
76
        if race.entrants_count_finished == 2:
77
            if our_total is not None:
78
                self.label_text = "We won!"
79
                self.text = Timer.timer_to_str(our_total / 2)
80
            elif opponent_total is not None:
81
                self.label_text = "They won. :("
82
                self.text = Timer.timer_to_str(opponent_total / 2)
83
84
    @staticmethod
85
    def get_coop_text(label_text_start: str, finished_partner: Entrant, finished1: Entrant, finished2: Entrant, current_timer: timedelta):
86
        finished_team_total = finished1.finish_time + finished2.finish_time
87
        time_to_beat = finished_team_total - finished_partner.finish_time
88
        if time_to_beat > current_timer:
89
            coop_text = Timer.timer_to_str(time_to_beat)
90
            coop_label_text = label_text_start + "to finish before"
91
        else:
92
            coop_label_text = str.format(
93
                f"{finished1.user.name} and {finished2.user.name} won")
94
            coop_text = Timer.timer_to_str(finished_team_total / 2)
95
        return coop_label_text, coop_text
96
97
    def get_coop_times(self, entrant, partner, opponent1, opponent2):
98
        our_total = None
99
        opponent_total = None
100
        if entrant.finish_time and partner.finish_time:
101
            our_total = entrant.finish_time + partner.finish_time
102
            self.logger.debug(f"calculated our average is {our_total / 2}")
103
        else:
104
            self.logger.debug(f"we haven't finished yet")
105
        if opponent1.finish_time and opponent2.finish_time:
106
            opponent_total = opponent1.finish_time + opponent2.finish_time
107
            self.logger.debug(
108
                f"calculated our opponent's average is {opponent_total / 2}")
109
        else:
110
            self.logger.debug(f"our opponents haven't finished")
111
        return our_total, opponent_total
112