示例#1
0
    def __init__(self, parent, api: API_SIX, dd: list, cv: list,
                 main_fleet: list, is_realrun: bool):
        super().__init__()
        self.parent = parent
        self.api = api
        self.escort_DD = dd
        self.escort_CV = cv
        self.main_fleet = main_fleet  # main fleet (6SS)
        self.battle_fleet = set()  # ships that on battle
        self.logger = get_logger(QLOGS.TAB_THER)

        self.is_running: bool = True

        self.qsettings = QSettings(wgv_data.get_qsettings_file(),
                                   QSettings.IniFormat)
        if self.qsettings.contains(QKEYS.THER_REPAIRS):
            self.repair_levels: list = list(
                map(int, self.qsettings.value(QKEYS.THER_REPAIRS)))
        else:
            self.repair_levels: list = [2]

        # Used for pre-battle
        self.map_data: dict = {}
        self.user_data: dict = {}

        self.helper = None
        self.boat_pool: set = set()  # host existing boats
        self.curr_node: str = '0'
        self.curr_sub_map: str = '0'
        self.final_fleet: list = []  # fill up required number of boats
        self.tickets: int = 0
        self.user_ships: dict = wgv_data.get_processed_userShipVo()

        self.pre_sortie = PreSortieCheck(self.api, is_realrun)
        self.logger.info("Init E6...")
示例#2
0
    def __init__(self, tab_thermopylae, api: API_SIX, user_ships: dict,
                 map_data: dict):
        self.api = api
        self.tab_thermopylae = tab_thermopylae
        self.logger = get_logger(QLOGS.TAB_THER)
        self.user_ships = user_ships
        self.map_data = map_data

        self.qsettings = QSettings(get_qsettings_file(), QSettings.IniFormat)
        if self.qsettings.contains(QKEYS.CONN_THER_RTY):
            self.reconnection_limit = self.qsettings.value(QKEYS.CONN_THER_RTY,
                                                           type=int)
        else:
            self.reconnection_limit = 3
        if self.qsettings.contains(QKEYS.THER_BOSS_RTY):
            self.boss_retry_limit = list(
                map(int, self.qsettings.value(QKEYS.THER_BOSS_RTY)))
        else:
            self.boss_retry_limit = [3, 5, 10]
        if self.qsettings.contains(QKEYS.THER_BOSS_STD):
            self.boss_retry_standard = list(
                map(int, self.qsettings.value(QKEYS.THER_BOSS_STD)))
        else:
            self.boss_retry_standard = [1, 2, 2]
        if self.qsettings.contains(QKEYS.THER_SHIP_STARS):
            self.ship_star: dict = self.qsettings.value(QKEYS.THER_SHIP_STARS)
        else:
            self.ship_star: dict = {}

        self.boss_retry_count: list = [0, 0, 0]
        self.points: int = 10
        self.adjutant_info: dict = {}  # level, curr_exp, exp_cap
示例#3
0
    def __init__(self, api: API_SIX, is_realrun: bool):
        self.api: API_SIX = api
        self.is_realrun = is_realrun

        self.logger = get_logger(QLOGS.TAB_THER)
        self.final_fleet: list = []
        self.sub_map_id: str = ""
        self.map_data: dict = {}
        self.user_data: dict = {}
        self.fleet_info: dict = {}
示例#4
0
 def show_graph(self, start_idx: int, end_idx: int, title: str) -> None:
     try:
         self.read_csv()
         fig = go.Figure()
         for i in range(start_idx, end_idx):
             fig.add_trace(
                 go.Scatter(x=self.resource_data[0],
                            y=self.resource_data[i],
                            name=CONST.CSV_HEADER[i]))
         fig.update_layout(title=title)
         if get_color_option() == "qdarkstyle":
             # self.setStyleSheet(get_color_scheme())
             fig.layout.template = pio.templates["plotly_dark"]
         else:
             pass
         # self.browser.setHtml(fig.to_html(include_plotlyjs='cdn'))
         # self.show()
         fig.show()
     except FileNotFoundError as e:
         logger = get_logger('DATAGRAPH')
         logger.debug('===================================')
         logger.debug(e)
         logger.debug('===================================')
示例#5
0
import os
import sys

from PyQt5.QtCore import QSize, Qt, QThreadPool, QSettings
from PyQt5.QtWidgets import (QWidget, QTabWidget, QGridLayout, QTabBar, QLabel)

from src.data import get_qsettings_file
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from src.gui.tabs.advance_functions import TabAdvanceFunctions
from src.gui.tabs.tab_thermopylae import TabThermopylae
from src.gui.tabs.tab_ship import TabShips
from src.gui.tabs.tab_expedition import TabExpedition

logger = get_logger(QLOGS.TABS)


def get_data_path(relative_path: str) -> str:
    # This needs to be in current file
    bundle_dir = getattr(sys, '_MEIPASS',
                         os.path.abspath(os.path.dirname(__file__)))
    res = os.path.join(bundle_dir, relative_path)
    return relative_path if not os.path.exists(res) else res


class TabBar(QTabBar):
    def tabSizeHint(self, index: int) -> QSize:
        size = QTabBar.tabSizeHint(self, index)
        w = int(self.width() / self.count())
        return QSize(w, size.height())
示例#6
0
from typing import Union

from cryptography.fernet import Fernet

from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger

logger = get_logger(QLOGS.FUNC)


class Encryptor:
    def __init__(self):
        pass

    @staticmethod
    def gen_key() -> bytes:
        return Fernet.generate_key()

    @staticmethod
    def save_key(key: bytes, path: str) -> None:
        with open(path, 'wb') as f:
            f.write(key)

    @staticmethod
    def load_key(path: str) -> bytes:
        with open(path, 'rb') as f:
            key = f.read()
        return key

    @staticmethod
    def encrypt_str(key: bytes, string: str):
示例#7
0
import urllib.request

from PyQt5.QtWidgets import QMessageBox, QWidget
from packaging import version

from src import utils as wgv_utils
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from src.func.worker import CallbackWorker
from src.gui.custom_widgets import QtWaitingSpinner

logger = get_logger(QLOGS.LOGIN)


class WGViewerVersionCheck:
    """
    Check if user's client version is up-to-date.
    This class is only instantiated during LogIn, and it is deleted after LogIn checking complete.
    """
    def __init__(self):
        self.latest_ver = None
        self.is_check_finished = False
        self.loading_screen = QtWaitingSpinner(self)
        self.bee = CallbackWorker(self.fetch_version, (), self.fetch_finished)
        self.bee.terminate()
        try:
            self.loading_screen.start()
            self.bee.start()
        except urllib.error.HTTPError as e:
            logger.error(e)
示例#8
0
    QVBoxLayout, QHBoxLayout,
    QDockWidget, QWidget, QLabel, QLineEdit, QMessageBox, QCheckBox, QLayout
)

from src import data as wgv_data
from src import utils as wgv_utils
from src.func import qsettings_keys as QKEYS
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from .resource_model import ResourceTableModel
from .align_list_view import BathListView, BuildListView, DevListView, ExpListView, TaskListView
from .constants import TASK_TYPE
from .timer_helper import get_tasks_countdowns, _calc_left_time
from .constants import EXP_LABEL_L, EXP_LABEL_R

logger = get_logger(QLOGS.SIDE_DOCK)


def get_data_path(relative_path: str) -> str:
    # This needs to be in current file
    bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
    res = os.path.join(bundle_dir, relative_path)
    return relative_path if not os.path.exists(res) else res


class SideDock(QDockWidget):
    """
    Side Dock/Panel, named "Navy Base Overview", displays all important data of the user.
        This is the first coded QWidget of WGViewer (even before LoginForm).
    """
    sig_resized = pyqtSignal()
示例#9
0
import sys

from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import (QWidget, QLineEdit, QVBoxLayout, QGridLayout,
                             QScrollArea, QHeaderView, QTableView)

from src import data as wgv_data
from src.wgr import WGR_API
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from .ships.delegate import ShipTableDelegate
from .ships.model import ShipModel
from .ships.proxy_model import ShipSortFilterProxyModel
from .ships.top_checkbox import TopCheckboxes

logger = get_logger(QLOGS.TAB_SHIP)


def get_data_path(relative_path: str) -> str:
    # This needs to be in current file
    bundle_dir = getattr(sys, '_MEIPASS',
                         os.path.abspath(os.path.dirname(__file__)))
    res = os.path.join(bundle_dir, relative_path)
    return relative_path if not os.path.exists(res) else res


class TabShips(QWidget):
    def __init__(self, tab_name: str, is_realrun: bool):
        super().__init__()
        logger.info("Creating Ships Tab...")
        self.api = WGR_API(wgv_data.load_cookies())
示例#10
0
from PyQt5.QtCore import QSettings
from requests import exceptions
from requests.utils import cookiejar_from_dict
from time import sleep
from urllib.request import Request, build_opener, HTTPCookieProcessor
from urllib.error import URLError
from http.client import HTTPResponse

from src.data import get_qsettings_file
from src.func import qsettings_keys as QKEYS
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from src.gui.login.helper import LoginHelper

logger = get_logger(QLOGS.API)


class WGR_API:
    """
    Warship Girls (R) - API
    """
    def __init__(self, cookies: dict):
        self.server = cookies['server']
        self.channel = cookies['channel']
        self.cookies = cookies['cookies']

        self.hlp = LoginHelper()
        qsettings = QSettings(get_qsettings_file(), QSettings.IniFormat)
        if qsettings.contains(QKEYS.CONN_API_RTY) is True:
            self.max_retry = qsettings.value(QKEYS.CONN_API_RTY, type=int)
示例#11
0
import ast
import re
from typing import Callable

from PyQt5.QtCore import Qt, QSortFilterProxyModel, QModelIndex, QRegExp
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QCheckBox

from src import data as wgv_data
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from . import constant as SCONST

logger = get_logger(QLOGS.DATA)


class ShipSortFilterProxyModel(QSortFilterProxyModel):
    def __init__(self, *args, **kwargs):
        QSortFilterProxyModel.__init__(self, *args, **kwargs)
        self.name_reg = None
        self.lock_opt = None
        self.level_opt = None
        self.mod_opt = None
        self.type_size_opt = None
        self.rarity_opt = None
        self.marry_opt = None
        self.country_opt = None

        self.checkboxes_opt = {}
        # LESSON: Unlike C++, Python have no reference to a variable, so following will create self.all_opts points
        # to [None, ...] which will remain unchanged and will fail filtering self.all_opts = [self.name_reg, ...]
示例#12
0
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QColor, QFont, QRegExpValidator
from PyQt5.QtWidgets import QWidget, QGridLayout, QCheckBox, QComboBox, QLabel, QLineEdit, QSpinBox

from src.utils import repair_id_to_text, repair_text_to_id
from src.func import qsettings_keys as QKEYS
from src.func import logger_names as QLOGS
from src.func.log_handler import get_logger
from src.gui.custom_widgets import QHLine

HEADER1: int = 20
HEADER2: int = 15
HEADER3: int = 12

logger = get_logger(QLOGS.SETTINGS)


def create_qcombobox(choices: list, idx: int = 0) -> QComboBox:
    c = QComboBox()
    c.addItems(choices)
    c.setCurrentIndex(idx)
    return c


def create_qlabel(text: str, font_size: int = -1) -> QLabel:
    l = QLabel()
    l.setText(text)
    if font_size != -1:
        font = QFont('consolas', font_size)
    else: