Пример #1
0
    def printPlayerPage(self, fields, params):

        def getPlayerItems(player, fields):
            all_items = self.model.players.getPlayerHaveItems(player['_id'])
            items = {}
            wealth_items = []
            inventory = []
            ring1_exists = False

            if self.cur_player:
                str_class = str(self.cur_player['login_class'])
            else:
                str_class = False

            authors_ids = Set()
            for item in all_items:
                if "author" in item:
                    authors_ids.add(item['author'])

            players_names = self.model.players.getPlayersList(authors_ids, ['_id', 'name'])
            for item in all_items:
                item['type'] = int(item['type'])

                # после type 100 начинаются неигровые предметы
                # которые учитывать не нужно

                if item['type'] < 100:

                    if 'author' in item:
                        item.update({
                        'img': item['img'] + '_thumb.png',
                        'big_img': item['img'] + '_fit.png'
                        })
                    else:
                        item['img'] = '/data/items/' + item['img'] + '.jpg'

                    if item['equipped'] and item['type'] == 6:
                        if ring1_exists:
                            item['type'] = 66
                        else:
                            ring1_exists = True

                    if 'UID' in item and 'pooled_date' in item and item['img'][:2] != './':
                        item['img'] = '/data/items/' + item['img'][:-10] + '.jpg'

                    if 'UID' in item and not 'author' in item:
                        item_uid_str = str(int(item['UID']))
                        created_by_player = False
                    else:
                        item_uid_str = str(item['_id'])
                        item['color'] = 1
                        created_by_player = True

                    can_use_item = '0'
                    if self.cur_player and 'lvl_min' in item and int(item['lvl_min']) <= int(
                            self.cur_player['login_lvl']):
                        can_use_item = '1'

                    item.update(prettyItemBonus(item, self.balance.stats_name))

                    record = item
                    record.update({
                        'link': '/obj/1/' + item_uid_str + '/' + can_use_item,
                        'id': str(item['_id']),
                        'created_by_player': created_by_player,
                    })

                    if item['type'] == 1 and str_class:
                        if not item['view'] in self.sbuilder.balance.available_weapons[str_class]:
                            item['cant_use'] = True

                    if item['type'] == 1:
                        item['str_type'] = item['view']
                    else:
                        item['str_type'] = self.sbuilder.balance.item_types[item['type'] % 60]

                    for player in players_names:
                        if "author" in item and player['_id'] == item['author']:
                            item['author_name'] = player['name']

                    if item['equipped']:
                        items.update({'slot' + str(item['type']): record})

                    else:
                        inventory.append(record)

                # shop items
                else:
                    wealth_items.append(item)

            fields.update({
                'items': items,
                'inventory': inventory,
                'wealth': wealth_items
            })

        def getCurrentTitle(player, fields):
            for title in player['titles']:
                if 'current' in title and title['current']:
                    fields['player'].update({'current_title': title['name']})
                    fields['player'].update({'name_with_title': re.sub('\{player\}', player['name'], title['desc'])})

                    return True

            fields['player'].update({'name_with_title': fields['player']['name']})
            return False

        def getEventsByPlayer(player, fields):
            if self.cur_player and self.cur_player['login_utc_offset']:
                utc_offset = self.cur_player['login_utc_offset']
            else:
                utc_offset = self.core.server_utc_offset

            events = self.model.events.getEvents(
                player_id=player['_id'],
                query={'upcoming': 1},
                fields={
                    'start_date': 1,
                    'guild_side_name': 1,
                    'sides_names': 1,
                    'target_name': 1,
                    '_id': 1,
                    'finish_date': 1,
                    'type': 1
                }
            )

            current_time = time()
            for event in events:

                event.update({'start_date_f': getRelativeDate(int(event['start_date']) + utc_offset)})

                if event['start_date'] <= current_time <= event['finish_date']:
                    fields.update({
                    'in_progress_event': event
                    })

            fields.update({'events': events})

        def getPlayerStats(player, fields):
            static = self.model.players.getStatisticStaticForPrint()
            buff_players_stats = self.model.players.getPlayerStatistics(player['user_id'])['stats']
            player_stats = []

            group = []
            group_name = ''

            for stat_static in static:
                if stat_static['type'] == 'none':
                    if group_name:
                        player_stats.append({'name': group_name, 'stats': group})

                    group_name = stat_static['text']
                    group = []
                else:
                    if stat_static['visibility']:
                        group.append({
                            'name': stat_static['text'],
                            'value': buff_players_stats[stat_static['name']]
                        })

            fields.update({'statistics': player_stats})

        def getPlayerAchvs(player, fields):

            buff_player_achvs = self.model.players.getPlayerAchvs(player['user_id'])['achvs']
            player_achvs = []

            group = []
            group_name = ''

            for achv_static in self.static:
                if achv_static['type'] == 0:
                    if group_name:
                        player_achvs.append({'name': group_name, 'achvs': group})

                    group_name = achv_static['name']
                    group = []
                else:
                    if achv_static['visibility']:
                        group.append({
                            'name': achv_static['name'],
                            'complete': buff_player_achvs[str(achv_static['UID'])],
                            'UID': achv_static['UID'],
                            'text': achv_static['text'],
                            'img': achv_static['img']
                        })

            player_achvs.append({'name': group_name, 'achvs': group})
            fields.update({'achvs': player_achvs})

        def getPlayerSpells(player, fields):
            spellbook = self.model.spells.getSpellBook(player['_id'])

            spells_ids = []
            for item in spellbook['spells']:
                if 'spell_UID' in item:
                    spells_ids.append(item['spell_UID'])
                else:
                    spells_ids.append(item['spell_id'])

            spells = self.model.spells.getSpellsByIds(spells_ids)

            for spell in spells:
                if 'author' in spell:
                    spell['img'] += '_thumb.png'
                else:
                    spell['img'] = '/' + self.core.IMAGE_SPELL_FOLDER + spell['img'] + '.jpg'

            fields.update({'spells': spells})

        def getArtwork(player, fields):
            # Получаем artwork
            is_artwork = False

            artwork_path = ''
            artwork_id = 0

            if 'artworks' in player:
                for artwork in player['artworks']:
                    if 'current' in artwork and artwork['current']:
                        if 'UID' in artwork:
                            artwork_path = self.core.ARTWORK_PATH + artwork['img'] + '.jpg'
                        else:
                            if artwork['img'] == './data/artwork_delete.jpg':
                                artwork_path = artwork['img']
                            else:
                                artwork_path = artwork['img'] + '_fit.png'

                        is_artwork = True
                        if '_id' in artwork:
                            artwork_id = artwork['_id']
                            break
                        else:
                            artwork_id = 'none'

            if not is_artwork:
                key = str(player['faction']) + str(player['race']) + str(player['class'])
                if key in self.balance.default_artworks:
                    artwork_path = self.core.ARTWORK_PATH + self.balance.default_artworks[key]['src'] + '.jpg'
                    artwork_id = self.balance.default_artworks[key]['_id']
                else:
                    fields.update({'default_artwork': True})

            fields['player'].update({
                'artwork': artwork_path,
                'artwork_id': artwork_id
            })

        def getPlayerBuffs(player, fields):

            fields.update({'stat_names': self.balance.stats_name})

            inactive_count = 0
            for buff in player['buffs']:
                buff['type'] = 'buff'

                buff['minutes'] = int(float(buff['start_time'] + buff['length'] - time()) / 60)

                if buff['minutes'] > 0:

                    if 'buff_uid' in buff:
                        buff['buff_img'] = '/data/spells/' + buff['buff_img'] + '.jpg'

                    for action_name in buff['actions']:
                        if action_name in player['stat']:
                            player['stat'][action_name]['current'] += buff['actions'][action_name]
                            is_buff = buff['actions'][action_name] > 0
                            buff['actions'][action_name] = str(buff['actions'][action_name])
                            if is_buff:
                                buff['actions'][action_name] = '+' + buff['actions'][action_name]
                            else:
                                buff['type'] = 'debuff'

                            player['stat'][action_name]['change'] = is_buff
                else:
                    inactive_count += 1

            if inactive_count != 0 and inactive_count == len(fields['player']['buffs']):
                fields['player']['buffs'] = []

        def getNearPlayers(player, fields):

            def miniFormatPlayers(players):
                for player in players:
                    player.update({
                        'class_name': self.balance.classes[str(player['class'])],
                        'race_name': self.balance.races[player['faction']][player['race']],
                    })
                return players

            rad = 6

            players_count = self.model.players.getNearPlayersCount(
                player['position']['x'],
                player['position']['y'],
                rad,
                player['name']
            )

            raw_records = self.model.players.getNearEnemies(rad, player)
            enemies = miniFormatPlayers(sample(raw_records, min(5, len(raw_records))))

            raw_records = self.model.players.getNearFriends(rad, player)
            friends = miniFormatPlayers(sample(raw_records, min(5, len(raw_records))))

            fields.update({
                'nearby_players': {
                    'count': players_count,
                    'enemies': enemies,
                    'friends': friends
                }
            })

        def getAuthorInfo(player, fields):
            info = self.model.misc.getAuthorLikes(player['_id'], {'likes': 1})

            if not info and 'ugc_enabled' in player and player['ugc_enabled']:
                info = {'likes': 0}

            if info:
                fields.update({'author_info': info})

        player = self.model.players.getPlayer(params['username'], fields='game')

        if not player:
            return self.sbuilder.throwWebError(7001)

        getAuthorInfo(player, fields)

        if 'works' in params:
            fields.update({'player': player})
            return self.printWorksPage(fields, params)

        fields.update({self.title: player['name'] + '\'s profile'})

        lvl_caps = self.model.getLvls()

        cache_need_save = False
        from_cache = False

        if self.cur_player and player['name'] == self.cur_player['login_name']:
            fields.update({'player_self': True})

        if from_cache:
            # fields = dict(loaded['content'].items() + fields.items())
            pass
        else:
            fields.update({'player': player})

            fields['player']['is_sleep'] = not (fields['player']['last_login'] >= time() - self.core.MAX_TIME_TO_SLEEP) 

            # format player's last events messages
            tags = self.model.misc.getTags()
            fields['player']['messages'] = getMessages(fields['player']['messages'], host=self.core.HOST, tags=tags)

            if self.cur_player and 'login_id' in self.cur_player and player and self.cur_player['login_id'] == player['_id']:
                getEventsByPlayer(player, fields)
                getPlayerSpells(player, fields)

            getPlayerBuffs(player, fields)
            getPlayerItems(player, fields)
            getCurrentTitle(player, fields)
            getPlayerStats(player, fields)
            getPlayerAchvs(player, fields)

            if self.cur_player and self.cur_player['login_id'] == player['_id']:
                getNearPlayers(player, fields)

            getPlayerSpells(player, fields)

            if 'pvp' in player and player['pvp'] == 1:
                fields.update({'pvp_mode': 1})

            fields['player'].update({
                'exp_level_cap': '',
                'exp_percent': 0
            })

            if int(player['lvl']) != self.balance.max_lvl:
                lvl_cap = lvl_caps[str(fields['player']['lvl'] + 1)]
                fields['player'].update({
                    'exp_level_cap': str(player['exp']) + ' / ' + str(lvl_cap),
                    'exp_percent': int((float(player['exp']) / float(lvl_cap)) * 100)
                })

            fields['player'].update({
                'HP_percent': int(float(fields['player']['stat']['HP']['current']) / fields['player']['stat']['HP']['max_dirty'] * 100),
                'MP_percent': int(float(fields['player']['stat']['MP']['current']) / fields['player']['stat']['MP']['max_dirty'] * 100)
                }
            )

            # Получаем расу
            fields['player']['race_name'] = self.balance.races[fields['player']['faction']][fields['player']['race']]

            # Получаем название класса
            fields['player']['class_name'] = self.balance.classes[str(fields['player']['class'])]

            # Получаем название пола
            fields['player']['sex_name'] = ['Female', 'Male'][fields['player']['sex']]

            getArtwork(player, fields)

            # получаем гильдию
            guild = self.getPlayersGuild(player['_id'])
            if guild:
                fields.update({'guild': {'name': guild['name'], 'link': guild['link_name']}})

            # Получаем тип урона
            fields['player']['damage_type'] = self.balance.damage_type[str(fields['player']['class'])]

            if self.cur_player:
                inventory_count = self.model.items.getInventoryCount(self.cur_player['login_id'])
            else:
                inventory_count = 0

            fields.update({
                'help': 'help' in params,
                'inventory_count': inventory_count,
                'player_coords': self.core.relativePosition(player['position'])
            })

        if cache_need_save:
            self.cache.cacheSave('!' + player['name'], content=fields)

        return basic.defaultController._printTemplate(self, 'player', fields)
Пример #2
0
	def printGuildDetail(self, fields, params = {}):

		guildname = params['guildname']

		guild = self.model.guilds.getGuildByName(guildname)
		if guild:
			guild['img'] = self.core.getAvatarLink(guild)
			if guild['img'].find("./") == 0:
				guild['img'] = guild['img'][2:]

			if 'site_link' in guild:
				if guild['site_link'] == '':
					del guild['site_link']

				elif guild['site_link'][:7] != 'http://':
					guild['site_link'] = 'http://'+guild['site_link']

			fields.update(guild)

			sort_name = ''
			sort_order = -1

			if 's' in params:
				if params['s'] == 'lead':
					sort_name = 'stat.lead.current'
				elif params['s'] == 'name':
					sort_name = 'name'
				elif params['s'] == 'achv':
					sort_name = 'achv_points'
				elif params['s'] == 'lvl':
					sort_name = 'lvl'
				elif params['s'] == 'pvp':
					sort_name = 'pvp_score'

			if 'o' in params:
				if params['o'] == '1':
					sort_order = 1

			if sort_name:
				sort = {sort_name: sort_order}
			else:
				sort = {}

			guild_members = self.model.guilds.getGuildMembers(guild, sort_query=sort)

			fields.update(self._formatGuildMembers(guild, guild_members, show_creator=True))

			if self.cur_player:
				if self.cur_player['login_id'] == fields['creator']['_id']:
					fields.update({'login_creator': True})
				else:
					players_guild = self.model.guilds.getPlayersGuild(self.cur_player['login_id'])
					if players_guild:
						if players_guild['name'] == guild['name']:
							fields.update({'in_guild':'this'})
						else:
							fields.update({'in_guild':'other'})
					else:
						if self.cur_player['login_id'] in guild['request']:
							fields.update({'requested': True})
						fields.update({'in_guild': False})

			messages = self.model.guilds.getGuildMessages(guild['name'])['history']

			fields.update({
				'messages': getMessages(messages),
			    self.title: '"'+guild['name']+'" guild'
			})

			news = self.model.guilds.getGuildNews(guild['_id'])['news'][::-1]
			last_news = news[:2]

			# cut text
			desc_cut = 128

			for story in last_news:
				if len(story['text']) > desc_cut:
					story['text'] = story['text'][:desc_cut:] + '...'

			fields.update({
				'news': last_news,
			    'events': self.model.events.getGuildEventsByID(guild['_id'])
			})

			if 'name' in params:
				inviter_info = self.model.players.getPlayerRawByName(params['name'], {'avatar': 1})
				if inviter_info and 'avatar' in inviter_info:
					fields.update({'inviter_avatar': inviter_info['avatar']})

			return basic.defaultController._printTemplate(self, 'guild_detail', fields)
		else:
			return self.sbuilder.throwWebError(404)
Пример #3
0
                Fore.RED +
                'El mensaje contiene caracteres que no están en el alfabeto.' +
                Style.RESET_ALL)
            print('Alfabeto: ' + alphabet + '\n')

        f.sendMessage(message, loggedUser, USERS_PATH,
                      users.index(receiver) + 1, affineKey, hillKey, alphabet)
        print(Fore.GREEN + '¡Mensaje enviado correctamente a ' + receiverName +
              '!\n' + Style.RESET_ALL)
    elif option == 2:
        # BANDEJA DE ENTRADA
        print(Fore.GREEN + '-* Bandeja de entrada de ' +
              loggedUser.getFullName() + ' *-' + Style.RESET_ALL)

        messages = f.getMessages(USERS_PATH,
                                 users.index(loggedUser) + 1, affineKey,
                                 hillKey, alphabet)
        for message in messages:
            day = message.date[:2]
            month = message.date[2:4]
            year = message.date[4:8]
            hour = message.date[8:10]
            minute = message.date[10:]
            print('[' + day + '/' + month + '/' + year + ' ' + hour + ':' +
                  minute + '] ' + message.sender + ' escribió: ' +
                  message.message)

        print(Fore.GREEN + '-* FIN *-\n' + Style.RESET_ALL)

        if len(messages) > 0:
            while True: