def route_community_guild_leave(gid, pid): user = current_user() found = False for player in user.players: if player.id == pid: found = True break if not found: return redirect(url_for('route_community_guild', id=gid)) membership = GuildMembership.query.filter(GuildMembership.guild_id == gid) membership = membership.filter(GuildMembership.player_id == pid).first() if not membership: return redirect(url_for('route_community_guild', id=gid)) rank = db.session().query( GuildRank.level).filter(GuildRank.id == membership.rank_id).first() if not rank: return redirect(url_for('route_community_guild', id=gid)) if rank.level < 3: db.session().delete(membership) db.session().commit() flash('You left the guild.', 'success') else: flash( 'Guild leaders can not leave the guild, use the disband feature instead.', 'error') return redirect(url_for('route_community_guild', id=gid))
def route_shop_order(id): item = db.session.query(ShopItem).filter(ShopItem.id == id).first() if not item or not item.enabled: return redirect(url_for('route_shop')) characters = current_user().players return render_template('shop/order.htm', item=item, characters=characters)
def route_community_guild(id): guild = Guild.query.filter(Guild.id == id).first() members = GuildMembership.query.filter( GuildMembership.guild_id == guild.id).all() invites = GuildInvite.query.filter(GuildInvite.guild_id == guild.id).all() wars = GuildWar.query.filter( or_(GuildWar.guild1 == id, GuildWar.guild2 == id)).filter( GuildWar.status == GuildWar.Active).all() user = current_user() if user: ids = [] for player in user.players: ids.append(player.id) for invite in invites: if invite.player_id in ids: invite.own = True for member in members: if member.player_id in ids: member.own = True return render_template('community/guilds/view.htm', guild=guild, members=members, invites=invites, leader=is_guild_leader(id), vice=is_guild_vice(id), wars=wars)
def route_account_restore(id): account = current_user() player = db.session().query(Player.account_id, Player.name).filter(Player.id == id).first() if not player or account.id != player.account_id: return redirect(url_for('route_account_manage')) return render_template('account/character_restore.htm', id=id, name=player.name)
def route_admin_news_compose(): user = current_user() boards = ForumBoard.query.all() return render_template('admin/news/compose.htm', characters=user.players, boards=boards)
def route_community_guild_leave(gid, pid): user = current_user() found = False for player in user.players: if player.id == pid: found = True break if not found: return redirect(url_for('route_community_guild', id=gid)) membership = GuildMembership.query.filter(GuildMembership.guild_id == gid) membership = membership.filter(GuildMembership.player_id == pid).first() if not membership: return redirect(url_for('route_community_guild', id=gid)) rank = db.session().query(GuildRank.level).filter(GuildRank.id == membership.rank_id).first() if not rank: return redirect(url_for('route_community_guild', id=gid)) if rank.level < 3: db.session().delete(membership) db.session().commit() flash('You left the guild.', 'success') else: flash('Guild leaders can not leave the guild, use the disband feature instead.', 'error') return redirect(url_for('route_community_guild', id=gid))
def route_account_edit(id): account = current_user() player = db.session().query(Player.account_id, Player.comment).filter(Player.id == id).first() if not account or not player or account.id != player.account_id: return redirect(url_for('route_account_manage')) return render_template('account/character_edit.htm', id=id, comment=player.comment)
def route_account_signature_post(id): account = current_user() player = Player.query.filter(Player.id == id).first() if player and account.id == player.account_id: signature = request.form.get('signature', '', type=str) # Strip the signature signature = signature.strip() # Strip consecutive spaces signature = ' '.join(signature.split()) # Make sure that len(signature) <= 255 signature = signature[:254] player.signature = signature db.session().commit() flash('The character signature has been updated.', 'success') else: flash( 'You cannot edit the signature of a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_account_character_post(): name = request.form.get('name', '', type=str) gender = request.form.get('gender', 0, type=int) vocation = request.form.get('vocation', 0, type=int) town = request.form.get('town', 1, type=int) error = False if len(name) < 4: flash('The name must be at least 4 characters long.', 'error') error = True if not CHAR_NAME_EXPR.match(name): flash('The name may only contain latin characters (A-Z, a-z and spaces).', 'error') error = True if len(name.split(' ')) > 3: flash('The name may only consist of 3 words.', 'error') error = True if gender not in NEW_CHARACTER.get('genders'): flash('The selected gender is not valid.', 'error') error = True if vocation not in NEW_CHARACTER.get('vocations'): flash('The selected vocation is not valid.', 'error') error = True if town not in NEW_CHARACTER.get('towns'): flash('The selected town is not valid.', 'error') error = True name = string.capwords(name) player = db.session().query(Player.id).filter(Player.name == name).first() if player: flash('The character name is already in use.', 'error') error = True if error: return redirect(url_for('route_account_character')) player = Player() player.name = name player.sex = gender player.vocation = vocation player.town_id = town player.account_id = current_user().id player.looktype = 136 if gender == 0 else 128 player.lookhead = NEW_CHARACTER.get('outfit')[0] player.lookbody = NEW_CHARACTER.get('outfit')[1] player.looklegs = NEW_CHARACTER.get('outfit')[2] player.lookfeet = NEW_CHARACTER.get('outfit')[3] db.session().add(player) db.session().commit() flash('The character has been created.', 'success') return redirect(url_for('route_account_manage'))
def route_admin_news_compose(): user = current_user() boards = ForumBoard.query.all() return render_template( 'admin/news/compose.htm', characters=user.players, boards=boards )
def route_shop(): categories = db.session.query(ShopCategory).all() user = current_user() return render_template( 'shop/browse.htm', categories=categories, user=user )
def route_admin_news_edit(id): news = News.query.filter(News.id == id).first() user = current_user() boards = ForumBoard.query.all() news.thread_content = db.session().query(ForumThread.content).filter(ForumThread.id == news.thread_id).first().content return render_template( 'admin/news/edit.htm', news = news, characters = user.players, boards = boards )
def route_forum_thread(thread, page): thread = ForumThread.query.filter(ForumThread.id == thread).first() if not thread: return redirect(url_for('route_forum')) if thread.deleted and session.get('access', 0) != ADMIN_ACCOUNT_TYPE: return redirect(url_for('route_forum')) player = db.session().query( Player.name, Player.level, Player.vocation, Player.town_id, Player.group_id, Player.postcount, Player.signature, Player.looktype, Player.lookhead, Player.lookbody, Player.looklegs, Player.lookfeet, Player.lookaddons).filter(Player.id == thread.author_id).first() if player: thread.player = player total = db.session().query( ForumPost.id).filter(ForumPost.thread_id == thread.id).count() perpage = POSTS_PER_PAGE posts = ForumPost.query.filter(ForumPost.thread_id == thread.id) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: posts = posts.filter(ForumPost.deleted == 0) posts = posts.order_by(ForumPost.timestamp.asc()) posts = posts.offset((page - 1) * perpage) posts = posts.limit(perpage).all() for post in posts: player = db.session().query( Player.name, Player.level, Player.vocation, Player.town_id, Player.group_id, Player.postcount, Player.signature, Player.looktype, Player.lookhead, Player.lookbody, Player.looklegs, Player.lookfeet, Player.lookaddons).filter(Player.id == post.author_id).first() if player: post.player = player user = current_user() characters = None if user: characters = db.session().query( Player.id, Player.name).filter(Player.account_id == user.id).all() pagination = Pagination(posts, page, perpage, total, posts) return render_template('forum/thread.htm', thread=thread, posts=posts, characters=characters, pagination=pagination, perpage=perpage, page=page)
def route_admin_news_edit(id): news = News.query.filter(News.id == id).first() user = current_user() boards = ForumBoard.query.all() news.thread_content = db.session().query(ForumThread.content).filter( ForumThread.id == news.thread_id).first().content return render_template('admin/news/edit.htm', news=news, characters=user.players, boards=boards)
def route_account_show(id): account = current_user() player = db.session().query(Player).filter(Player.id == id).first() if player and account.id == player.account_id: player.hidden = 0 db.session().commit() flash('The characted is no longer hidden.', 'success') else: flash('You cannot show a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_account_restore_post(id): account = current_user() player = db.session().query(Player).filter(Player.id == id).first() if player and account.id == player.account_id: player.deletion = 0 db.session().commit() flash('The character has been restored.', 'success') else: flash('You cannot restore a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_account_delete_post(id): account = current_user() player = db.session().query(Player).filter(Player.id == id).first() if player and account.id == player.account_id: player.deletion = int(time()) + (DELETION_DELAY * 86400) db.session().commit() flash('The character has been scheduled for deletion.', 'success') else: flash('You cannot delete a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_account_edit_post(id): account = current_user() player = db.session().query(Player).filter(Player.id == id).first() if player and account.id == player.account_id: player.comment = request.form.get('comment', '', type=str) db.session().commit() flash('The character comment has been updated.', 'success') else: flash('You cannot edit the comment of a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_account_key(): user = current_user() if user.key != '': return redirect(url_for('route_account_manage')) parts = [] for i in range(4): parts.append(''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(4))) key = '-'.join(parts) user.key = key db.session().commit() return render_template('account/key.htm', key=key)
def route_forum_thread(thread, page): thread = ForumThread.query.filter(ForumThread.id == thread).first() if not thread: return redirect(url_for('route_forum')) if thread.deleted and session.get('access', 0) != ADMIN_ACCOUNT_TYPE: return redirect(url_for('route_forum')) player = db.session().query( Player.name, Player.level, Player.vocation, Player.town_id, Player.group_id, Player.postcount, Player.signature, Player.looktype, Player.lookhead, Player.lookbody, Player.looklegs, Player.lookfeet, Player.lookaddons ).filter(Player.id == thread.author_id).first() if player: thread.player = player total = db.session().query(ForumPost.id).filter(ForumPost.thread_id == thread.id).count() perpage = POSTS_PER_PAGE posts = ForumPost.query.filter(ForumPost.thread_id == thread.id) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: posts = posts.filter(ForumPost.deleted == 0) posts = posts.order_by(ForumPost.timestamp.asc()) posts = posts.offset((page - 1) * perpage) posts = posts.limit(perpage).all() for post in posts: player = db.session().query( Player.name, Player.level, Player.vocation, Player.town_id, Player.group_id, Player.postcount, Player.signature, Player.looktype, Player.lookhead, Player.lookbody, Player.looklegs, Player.lookfeet, Player.lookaddons ).filter(Player.id == post.author_id).first() if player: post.player = player user = current_user() characters = None if user: characters = db.session().query(Player.id, Player.name).filter(Player.account_id == user.id).all() pagination = Pagination(posts, page, perpage, total, posts) return render_template( 'forum/thread.htm', thread=thread, posts=posts, characters=characters, pagination=pagination, perpage=perpage, page=page )
def route_shop_order_post(id): item = request.form.get('item', 0, type=int) character = request.form.get('character', 0, type=int) error = False if item == 0 or character == 0: return redirect(url_for('route_shop')) item = db.session().query(ShopItem).filter(ShopItem.id == item).first() if not item: flash('Failed to find the selected item.', 'error') error = True character = db.session().query(Player).filter(Player.id == character).first() if not character: flash('Failed to find the selected character.', 'error') error = True account = current_user() if character not in account.players: flash('You can not order an item for foreign character.', 'error') error = True if account.points < item.price: flash('You do not have enough premium points to purchase this item.', 'error') error = True if not error: order = ShopOrder() order.name = item.name order.type = item.type order.key = item.key order.value = item.value order.price = item.price order.ordered = int(time()) order.character_id = character.id account.points -= item.price db.session().add(order) db.session().commit() flash('The item has been ordered and should be soon delivered to your character.', 'success') return redirect(url_for('route_shop'))
def route_forum_board(board, page): board = ForumBoard.query.filter(ForumBoard.id == board).first() if not board: return redirect(url_for('route_forum')) total = db.session().query( ForumThread.id).filter(ForumThread.board_id == board.id).count() perpage = THREADS_PER_PAGE threads = ForumThread.query.filter(ForumThread.board_id == board.id) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: threads = threads.filter(ForumThread.deleted == 0) if page == 1: threads = threads.order_by(ForumThread.pinned.desc()) threads = threads.order_by(ForumThread.lastpost.desc()) threads = threads.offset((page - 1) * perpage) threads = threads.limit(perpage).all() for thread in threads: posts = db.session().query( ForumPost.id).filter(ForumPost.thread_id == thread.id).count() thread.posts = posts user = current_user() characters = None if user: characters = db.session().query( Player.id, Player.name).filter(Player.account_id == user.id).all() pagination = Pagination(threads, page, perpage, total, threads) return render_template('forum/board.htm', board=board, threads=threads, characters=characters, pagination=pagination, perpage=perpage, page=page)
def route_account_password_post(): pswd = request.form.get('pswd', '', type=str) pswdNew = request.form.get('pswdNew', '', type=str) pswdRepeat = request.form.get('pswdRepeat', '', type=str) user = current_user() error = False hash = sha1() hash.update(pswd.encode('utf-8')) pswd = hash.hexdigest() if user.password != pswd: flash('The current password is not correct.', 'error') error = True if len(pswdNew) < 5: flash('The new password must be at least 5 characters long.', 'error') error = True if pswdNew == user.password: flash('The new password must be different than the current one.', 'error') error = True if pswdNew != pswdRepeat: flash('The new passwords do not match.', 'error') error = True if error: return redirect(url_for('route_account_password')) hash = sha1() hash.update(pswdNew.encode('utf-8')) newPswd = hash.hexdigest() user.password = newPswd db.session().commit() flash('The password has been changed.', 'success') return redirect(url_for('route_account_manage'))
def route_community_guild_join(gid, pid): user = current_user() found = False for player in user.players: if player.id == pid: found = True break if not found: return redirect(url_for('route_community_guild', id=gid)) invite = GuildInvite.query.filter(GuildInvite.guild_id == gid) invite = invite.filter(GuildInvite.player_id == pid).first() if not invite: return redirect(url_for('route_community_guild', id=gid)) rank = db.session().query(GuildRank.id).filter(GuildRank.guild_id == gid) rank = rank.filter(GuildRank.level == 1).first() if not rank: return redirect(url_for('route_community_guild', id=gid)) membership = GuildMembership() membership.player_id = pid membership.guild_id = gid membership.rank_id = rank.id membership.nick = '' db.session().delete(invite) db.session().add(membership) db.session().commit() flash('You have joined the guild.', 'success') return redirect(url_for('route_community_guild', id=gid))
def route_account_signature_post(id): account = current_user() player = Player.query.filter(Player.id == id).first() if player and account.id == player.account_id: signature = request.form.get('signature', '', type=str) # Strip the signature signature = signature.strip() # Strip consecutive spaces signature = ' '.join(signature.split()) # Make sure that len(signature) <= 255 signature = signature[:254] player.signature = signature db.session().commit() flash('The character signature has been updated.', 'success') else: flash('You cannot edit the signature of a character that does not belong to you.', 'error') return redirect(url_for('route_account_manage'))
def route_community_guild(id): guild = Guild.query.filter(Guild.id == id).first() members = GuildMembership.query.filter(GuildMembership.guild_id == guild.id).all() invites = GuildInvite.query.filter(GuildInvite.guild_id == guild.id).all() wars = GuildWar.query.filter(or_(GuildWar.guild1 == id, GuildWar.guild2 == id)).filter(GuildWar.status == GuildWar.Active).all() user = current_user() if user: ids = [] for player in user.players: ids.append(player.id) for invite in invites: if invite.player_id in ids: invite.own = True for member in members: if member.player_id in ids: member.own = True return render_template( 'community/guilds/view.htm', guild=guild, members=members, invites=invites, leader=is_guild_leader(id), vice=is_guild_vice(id), wars=wars )
def route_forum_board(board, page): board = ForumBoard.query.filter(ForumBoard.id == board).first() if not board: return redirect(url_for('route_forum')) total = db.session().query(ForumThread.id).filter(ForumThread.board_id == board.id).count() perpage = THREADS_PER_PAGE threads = ForumThread.query.filter(ForumThread.board_id == board.id) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: threads = threads.filter(ForumThread.deleted == 0) if page == 1: threads = threads.order_by(ForumThread.pinned.desc()) threads = threads.order_by(ForumThread.lastpost.desc()) threads = threads.offset((page - 1) * perpage) threads = threads.limit(perpage).all() for thread in threads: posts = db.session().query(ForumPost.id).filter(ForumPost.thread_id == thread.id).count() thread.posts = posts user = current_user() characters = None if user: characters = db.session().query(Player.id, Player.name).filter(Player.account_id == user.id).all() pagination = Pagination(threads, page, perpage, total, threads) return render_template( 'forum/board.htm', board=board, threads=threads, characters=characters, pagination=pagination, perpage=perpage, page=page )
def route_community_guild_create(): characters = current_user().players return render_template('community/guilds/create.htm', characters=characters)
def route_zaypay(): return render_template( 'zaypay/pay.htm', options = ZAYPAY_OPTIONS, account_id = current_user().id )
def route_forum_thread_post(id): thread = ForumThread.query.filter(ForumThread.id == id).first() if not thread: flash('The thread you are trying to reply to does not exist.', 'error') return redirect(url_for('route_forum')) character = request.form.get('character', 0, type=int) content = request.form.get('content', '', type=str) error = False user = current_user() found = False for player in user.players: if player.id == character: found = True break if not found: flash('You cannot post from a character that does not belong to you.', 'error') error = True timestamp = int(time()) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: if thread.deleted: flash('You cannot post in a deleted thread.', 'error') error = True if thread.locked: flash('You cannot post in a locked thread.', 'error') error = True if user.lastpost + POST_COOLDOWN > timestamp: flash( 'You must wait {} seconds before posting again.'.format( POST_COOLDOWN), 'error') error = True if user.creation + (60 * 60 * 24 * FORUM_ACCOUNT_AGE_REQUIREMENT) > timestamp: flash( 'Your account must be at least {} days old to post on the forum.' .format(FORUM_ACCOUNT_AGE_REQUIREMENT), 'error') error = True if player.level < FORUM_LEVEL_REQUIREMENT: flash( 'Your character must be at least level {} to post on the forum.' .format(FORUM_LEVEL_REQUIREMENT), 'error') error = True if len(content) < 4: flash('Your reply must be at least 4 characters long.', 'error') error = True # Redirect page page = 1 if not error: if len(content) > FORUM_CHARACTER_LIMIT: content = content[:FORUM_CHARACTER_LIMIT] content = content.strip() content = '\n'.join(content.split('\n')) content = escape(content) content = str(content).replace('\n', '<br>') post = ForumPost() post.author_id = character post.content = content post.timestamp = timestamp post.thread_id = id post.deleted = 0 thread.lastpost = timestamp user.lastpost = timestamp player.postcount = player.postcount + 1 db.session().add(post) db.session().commit() posts = db.session().query( ForumPost.id).filter(ForumPost.thread_id == id).count() page = ceil(posts / POSTS_PER_PAGE) print(posts) print(page) return redirect(url_for('route_forum_thread', thread=id, page=page))
def route_zaypay(): return render_template('zaypay/pay.htm', options=ZAYPAY_OPTIONS, account_id=current_user().id)
def route_account_manage(): return render_template('account/manage.htm', account=current_user())
def route_community_guilds(): guilds = Guild.query.order_by(Guild.name).all() return render_template('community/guilds/list.htm', guilds=guilds, user=current_user())
def route_community_guild_create_post(): name = request.form.get('name', '', type=str) character = request.form.get('character', 0, type=int) motd = request.form.get('motd', '', type=str) user = current_user() error = False character = Player.query.filter(Player.id == character).first() if not character or character.account_id != user.id: flash('You can not create a guild with not your own character.', 'error') error = True if character and character.level < GUILD_LEVEL: flash('The character needs to be at least level {}.'.format(GUILD_LEVEL), 'error') error = True if character and character.getGuild(): flash('The character can not be a member of another guild.', 'error') error = True if len(name) < 4 or len(name) > 32: flash('The guild name must be between 4 and 32 characters long.', 'error') error = True if not GUILD_NAME_EXPR.match(name): flash('The guild name may only contain latin characters (A-Z, a-z and spaces).', 'error') error = True if len(name.split(' ')) > 3: flash('The guild name may only consist of 3 words.', 'error') error = True guild = Guild.query.filter(Guild.name == name).first() if guild: flash('The guild name is taken by another guild.', 'error') error = True if error: return redirect(url_for('route_community_guild_create')) guild = Guild() guild.name = name guild.ownerid = character.id guild.creationdata = int(time()) guild.motd = motd db.session().add(guild) db.session().commit() rank = db.session().query(GuildRank.id).filter(GuildRank.guild_id == guild.id).filter(GuildRank.level == 3).first() membership = GuildMembership() membership.player_id = character.id membership.guild_id = guild.id membership.rank_id = rank[0] db.session().add(membership) db.session().commit() flash('The guild has been created.', 'success') return redirect(url_for('route_community_guild', id=guild.id))
def route_forum_board_post(id): board = ForumBoard.query.filter(ForumBoard.id == id).first() if not board: flash('The board you are trying to create a thread on does not exist.', 'error') return redirect(url_for('route_forum')) subject = request.form.get('subject', '', type=str) character = request.form.get('character', 0, type=int) content = request.form.get('content', '', type=str) error = False user = current_user() found = False for player in user.players: if player.id == character: found = True break if not found: flash('You cannot post from a character that does not belong to you.', 'error') error = True timestamp = int(time()) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: if board.locked: flash('You cannot create a thread in a locked board.', 'error') error = True if user.lastpost + POST_COOLDOWN > timestamp: flash( 'You must wait {} seconds before posting again.'.format( POST_COOLDOWN), 'error') error = True if user.creation + (60 * 60 * 24 * FORUM_ACCOUNT_AGE_REQUIREMENT) > timestamp: flash( 'Your account must be at least {} days old to post on the forum.' .format(FORUM_ACCOUNT_AGE_REQUIREMENT), 'error') error = True if player.level < FORUM_LEVEL_REQUIREMENT: flash( 'Your character must be at least level {} to post on the forum.' .format(FORUM_LEVEL_REQUIREMENT), 'error') error = True if len(content) < 15: flash('Your thread content must be at least 15 characters long.', 'error') error = True if len(subject) < 5: flash('Your thread subject must be at least 5 characters long', 'error') error = True if not error: if len(content) > FORUM_CHARACTER_LIMIT: content = content[:FORUM_CHARACTER_LIMIT] content = content.strip() content = '\n'.join(content.split('\n')) content = escape(content) content = str(content).replace('\n', '<br>') thread = ForumThread() thread.subject = subject thread.timestamp = timestamp thread.board_id = id thread.locked = 0 thread.pinned = 0 thread.lastpost = timestamp thread.author_id = character thread.content = content thread.deleted = 0 user.lastpost = timestamp player.postcount = player.postcount + 1 db.session().add(thread) db.session().commit() return redirect(url_for('route_forum_thread', thread=thread.id, page=1)) return redirect(url_for('route_forum_board', board=id, page=1))
def route_forum_thread_post(id): thread = ForumThread.query.filter(ForumThread.id == id).first() if not thread: flash('The thread you are trying to reply to does not exist.', 'error') return redirect(url_for('route_forum')) character = request.form.get('character', 0, type=int) content = request.form.get('content', '', type=str) error = False user = current_user() found = False for player in user.players: if player.id == character: found = True break if not found: flash('You cannot post from a character that does not belong to you.', 'error') error = True timestamp = int(time()) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: if thread.deleted: flash('You cannot post in a deleted thread.', 'error') error = True if thread.locked: flash('You cannot post in a locked thread.', 'error') error = True if user.lastpost + POST_COOLDOWN > timestamp: flash('You must wait {} seconds before posting again.'.format(POST_COOLDOWN), 'error') error = True if user.creation + (60 * 60 * 24 * FORUM_ACCOUNT_AGE_REQUIREMENT) > timestamp: flash('Your account must be at least {} days old to post on the forum.'.format(FORUM_ACCOUNT_AGE_REQUIREMENT), 'error') error = True if player.level < FORUM_LEVEL_REQUIREMENT: flash('Your character must be at least level {} to post on the forum.'.format(FORUM_LEVEL_REQUIREMENT), 'error') error = True if len(content) < 4: flash('Your reply must be at least 4 characters long.', 'error') error = True # Redirect page page = 1 if not error: if len(content) > FORUM_CHARACTER_LIMIT: content = content[:FORUM_CHARACTER_LIMIT] content = content.strip() content = '\n'.join(content.split('\n')) content = escape(content) content = str(content).replace('\n', '<br>') post = ForumPost() post.author_id = character post.content = content post.timestamp = timestamp post.thread_id = id post.deleted = 0 thread.lastpost = timestamp user.lastpost = timestamp player.postcount = player.postcount + 1 db.session().add(post) db.session().commit() posts = db.session().query(ForumPost.id).filter(ForumPost.thread_id == id).count() page = ceil(posts / POSTS_PER_PAGE) print(posts) print(page) return redirect(url_for('route_forum_thread', thread=id, page=page))
def route_community_guild_create_post(): name = request.form.get('name', '', type=str) character = request.form.get('character', 0, type=int) motd = request.form.get('motd', '', type=str) user = current_user() error = False character = Player.query.filter(Player.id == character).first() if not character or character.account_id != user.id: flash('You can not create a guild with not your own character.', 'error') error = True if character and character.level < GUILD_LEVEL: flash( 'The character needs to be at least level {}.'.format(GUILD_LEVEL), 'error') error = True if character and character.getGuild(): flash('The character can not be a member of another guild.', 'error') error = True if len(name) < 4 or len(name) > 32: flash('The guild name must be between 4 and 32 characters long.', 'error') error = True if not GUILD_NAME_EXPR.match(name): flash( 'The guild name may only contain latin characters (A-Z, a-z and spaces).', 'error') error = True if len(name.split(' ')) > 3: flash('The guild name may only consist of 3 words.', 'error') error = True guild = Guild.query.filter(Guild.name == name).first() if guild: flash('The guild name is taken by another guild.', 'error') error = True if error: return redirect(url_for('route_community_guild_create')) guild = Guild() guild.name = name guild.ownerid = character.id guild.creationdata = int(time()) guild.motd = motd db.session().add(guild) db.session().commit() rank = db.session().query(GuildRank.id).filter( GuildRank.guild_id == guild.id).filter(GuildRank.level == 3).first() membership = GuildMembership() membership.player_id = character.id membership.guild_id = guild.id membership.rank_id = rank[0] db.session().add(membership) db.session().commit() flash('The guild has been created.', 'success') return redirect(url_for('route_community_guild', id=guild.id))
def route_paypal(): return render_template( 'paypal/donate.htm', buttons=PAYPAL_BUTTONS, account_id=current_user().id )
def route_forum_board_post(id): board = ForumBoard.query.filter(ForumBoard.id == id).first() if not board: flash('The board you are trying to create a thread on does not exist.', 'error') return redirect(url_for('route_forum')) subject = request.form.get('subject', '', type=str) character = request.form.get('character', 0, type=int) content = request.form.get('content', '', type=str) error = False user = current_user() found = False for player in user.players: if player.id == character: found = True break if not found: flash('You cannot post from a character that does not belong to you.', 'error') error = True timestamp = int(time()) if session.get('access', 0) != ADMIN_ACCOUNT_TYPE: if board.locked: flash('You cannot create a thread in a locked board.', 'error') error = True if user.lastpost + POST_COOLDOWN > timestamp: flash('You must wait {} seconds before posting again.'.format(POST_COOLDOWN), 'error') error = True if user.creation + (60 * 60 * 24 * FORUM_ACCOUNT_AGE_REQUIREMENT) > timestamp: flash('Your account must be at least {} days old to post on the forum.'.format(FORUM_ACCOUNT_AGE_REQUIREMENT), 'error') error = True if player.level < FORUM_LEVEL_REQUIREMENT: flash('Your character must be at least level {} to post on the forum.'.format(FORUM_LEVEL_REQUIREMENT), 'error') error = True if len(content) < 15: flash('Your thread content must be at least 15 characters long.', 'error') error = True if len(subject) < 5: flash('Your thread subject must be at least 5 characters long', 'error') error = True if not error: if len(content) > FORUM_CHARACTER_LIMIT: content = content[:FORUM_CHARACTER_LIMIT] content = content.strip() content = '\n'.join(content.split('\n')) content = escape(content) content = str(content).replace('\n', '<br>') thread = ForumThread() thread.subject = subject thread.timestamp = timestamp thread.board_id = id thread.locked = 0 thread.pinned = 0 thread.lastpost = timestamp thread.author_id = character thread.content = content thread.deleted = 0 user.lastpost = timestamp player.postcount = player.postcount + 1 db.session().add(thread) db.session().commit() return redirect(url_for('route_forum_thread', thread=thread.id, page=1)) return redirect(url_for('route_forum_board', board=id, page=1))
def route_paypal(): return render_template('paypal/donate.htm', buttons=PAYPAL_BUTTONS, account_id=current_user().id)
def route_shop_history(): user = current_user() history = ShopHistory.query.filter(ShopHistory.account_id == user.id).all() return render_template('shop/history.htm', history=history)