def cancel_sell(uid, entry_id): s = current_session() entry = s.query(Exchange).filter( Exchange.id == entry_id, Exchange.seller_id == uid, ).first() if not entry: raise exceptions.ItemNotFound helpers.require_free_backpack_slot(s, uid) item = entry.item item.owner_id = uid item.status = 'backpack' s.add( ItemActivity( uid=uid, action='cancel_sell', item_id=entry.item.id, extra=json.dumps({'price': entry.price}), created=datetime.datetime.now(), )) s.delete(entry)
def draw(uid, currency): s = current_session() u = Account.find(uid) if not u: raise exceptions.UserNotFound helpers.require_free_backpack_slot(s, uid) if currency == 'ppoint': amount = constants.LOTTERY_PRICE Account.add_user_credit(u, [('ppoint', -amount)], exceptions.InsufficientFunds) elif currency == 'jiecao': amount = constants.LOTTERY_JIECAO_PRICE Account.add_user_credit(u, [('jiecao', -amount)], exceptions.InsufficientFunds) else: raise exceptions.InvalidCurrency reward = random.choice(constants.LOTTERY_REWARD_LIST) item = Item(owner_id=uid, sku=reward, status='backpack') s.add(item) s.flush() s.add(ItemActivity( uid=uid, action='lottery', item_id=item.id, extra=json.dumps({'currency': currency, 'amount': amount}), created=datetime.datetime.now(), )) return reward
def sell(uid, item_id, price): s = current_session() item = s.query(Item).filter(Item.id == item_id, Item.owner_id == uid).first() if not item: raise exceptions.ItemNotFound existing = s.query(Exchange).filter(Exchange.seller_id == uid).count() if existing > constants.MAX_SELLING_ITEMS: raise exceptions.TooManySellingItems s.add(Exchange( seller_id=uid, item_id=item.id, price=price, )) s.add( ItemActivity( uid=uid, action='sell', item_id=item.id, extra=json.dumps({'price': price}), created=datetime.datetime.now(), )) item.status = 'exchange' item.owner_id = None
def use(uid, item_sku_or_id, is_consume=False): s = current_session() if isinstance(item_sku_or_id, int): item = s.query(Item).filter(Item.owner_id == uid, Item.id == item_sku_or_id) else: item = s.query(Item).filter(Item.owner_id == uid, Item.sku == item_sku_or_id) item = item.first() if not item: raise exceptions.ItemNotFound s.add( ItemActivity( uid=uid, action='use', item_id=item.id, created=datetime.datetime.now(), )) if not is_consume: itemobj = GameItem.from_sku(item.sku) if not itemobj.usable: raise exceptions.ItemNotUsable itemobj.use(s, item.owner) item.status = 'used' item.owner_id = None
def add(uid, item_sku, reason=None): s = current_session() helpers.require_free_backpack_slot(s, uid) item = Item(owner_id=uid, sku=item_sku, status='backpack') s.add(item) s.flush() s.add( ItemActivity( uid=uid, action='get', item_id=item.id, extra=reason and json.dumps(reason), created=datetime.datetime.now(), )) return item.id
def buy(uid, entry_id): s = current_session() u = Account.find(uid) if not u: raise exceptions.UserNotFound entry = s.query(Exchange).filter(Exchange.id == entry_id).first() if not entry: raise exceptions.ItemNotFound seller = entry.seller if u.ppoint < entry.price: raise exceptions.InsufficientFunds helpers.require_free_backpack_slot(s, uid) u.ppoint -= entry.price seller.ppoint += entry.price item = entry.item s.add( ItemActivity( uid=uid, action='buy', item_id=entry.item.id, extra=json.dumps({ 'seller': seller.id, 'price': entry.price }), created=datetime.datetime.now(), )) item.owner_id = u.id item.status = 'backpack' s.delete(entry)
def drop(uid, item_id): s = current_session() item = s.query(Item) \ .filter(Item.id == item_id) \ .filter(Item.owner_id == uid) \ .filter(Item.status == 'backpack') \ .first() if not item: raise exceptions.ItemNotFound item.owner_id = None item.status = 'dropped' s.add( ItemActivity( uid=uid, action='drop', item_id=item.id, created=datetime.datetime.now(), )) return item.id