示例#1
0
class Controller:
    def __init__(self):
        self.cfg = config.Config()
        self.view = View(self.LblLeftClickHandler, self.LblRightClickHandler,
                         self.NotesUpdatedHandler, self.ViewToggleHandler)
        self.view_format = ViewFormat.LABEL_ONLY
        self.view.SetViewFormat(self.view_format)
        self.villain = None
        self.build = None
        self.error_text = None
        self.game_time = 0.0
        self.view.AddTask(self.PollAndUpdate, 1000)

    # client api:
    # https://us.battle.net/forums/en/sc2/topic/20748195420
    def PollAndUpdate(self):
        self.error_text = None
        try:
            response = requests.get("http://localhost:6119/game")
            game_info = json.loads(response.text)
            self.game_time = game_info['displayTime']
            for player in game_info['players']:
                name = player['name']
                if self.villain is not None and name == self.villain.name:
                    break
                elif name != self.cfg.hero:
                    self.villain = Villain(name, self.cfg.data_dir)
                    self.build = Build(player['race'], self.cfg.data_dir)
                    self.view.SetNotesText(self.villain.GetNotes())
                    break
            else:
                self.error_text = 'No villain found.'
        except Exception as e:
            self.error_text = "Can't connect to API."
            print(e)
        self.UpdateView(self.view_format)

    def UpdateView(self, view_format):
        # Try to change view format.
        if self.error_text is not None:
            if view_format == ViewFormat.TAB:
                self.view_format = view_format
            else:
                self.view_format = ViewFormat.LABEL_ONLY
        elif view_format == ViewFormat.TAB or view_format == ViewFormat.LABEL_ONLY:
            self.view_format = view_format
        elif view_format == ViewFormat.NOTES_VIEW:
            if self.villain is not None:
                self.view_format = view_format
        elif view_format == ViewFormat.BUILD_VIEW:
            if self.build is not None:
                self.view_format = view_format

        # Set label text
        if self.view_format == ViewFormat.TAB:
            self.view.SetLabelText('')
        elif self.error_text is not None:
            self.view.SetLabelText(self.error_text)
        elif self.view_format == ViewFormat.BUILD_VIEW:
            self.view.SetLabelText('{}: {}'.format(self.build.race,
                                                   self.build.name))
        else:
            self.view.SetLabelText(self.villain.name)

        # Other stuff
        if self.view_format == ViewFormat.BUILD_VIEW:
            self.view.SetBuildText(
                past=self.build.GetBuildText(before=self.game_time),
                future=self.build.GetBuildText(earliest=self.game_time))
        self.view.SetViewFormat(self.view_format)

    def Run(self):
        self.view.Run()

    # Make us smaller.
    def LblLeftClickHandler(self, e):
        if self.view_format == ViewFormat.TAB:
            pass
        elif self.view_format == ViewFormat.LABEL_ONLY:
            self.UpdateView(ViewFormat.TAB)
        else:
            self.UpdateView(ViewFormat.LABEL_ONLY)

    # Make us bigger.
    def LblRightClickHandler(self, e):
        if self.view_format == ViewFormat.TAB:
            self.UpdateView(ViewFormat.LABEL_ONLY)
        elif self.view_format == ViewFormat.LABEL_ONLY:
            self.UpdateView(ViewFormat.NOTES_VIEW)

    def NotesUpdatedHandler(self, e):
        self.villain.SaveNotes(self.view.GetVillainNotes())

    def ViewToggleHandler(self):
        if self.view_format == ViewFormat.NOTES_VIEW:
            self.UpdateView(ViewFormat.BUILD_VIEW)
        elif self.view_format == ViewFormat.BUILD_VIEW:
            self.UpdateView(ViewFormat.NOTES_VIEW)