Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 104 additions & 70 deletions source/node/handlers/Play/Api/V1/Servers/index.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ app.on 'mount', (parent) ->
, loadServerStorageItems(
maria.Server.Storage.Item
)

, loadServerStorageTags(
maria.Server.Tag
)
, (req, res) ->

res.json 200, req.storage
Expand Down Expand Up @@ -80,7 +82,7 @@ app.on 'mount', (parent) ->
maria.Server.Store.Item.Enchantment
)
, loadServerStoreTags(
maria.Server.Store.Tag
maria.Server.Tag
)

, (req, res) ->
Expand All @@ -90,9 +92,16 @@ app.on 'mount', (parent) ->


###
Отдает предмет из магазина сервера аутентифицированному игроку.
Покупает предмет сервера аутентифицированному игроку.

Перед покупкой следующие условия должны быть удовлетворены:
— Покупаемое кол-во предметов делится без остатка на продаваемое кол-во

Стоимость предмета хранится в базе данных.

Стоимость зачарованного предмета
###
app.get '/:serverId(\\d+)/store/items/:itemId'
app.post '/:serverId(\\d+)/store/items/:itemId(\\d+)/order'

, access

Expand All @@ -101,19 +110,63 @@ app.on 'mount', (parent) ->
, loadServerStore('serverId',
maria.Server.Store
)
, loadServerStoreEnchantments(
maria.Server.Store.Enchantment
)
, loadServerStoreItem('itemId',
maria.Server.Store.Item
)
, loadServerStoreItemEnchantments(
maria.Server.Store.Item.Enchantment
)

, (req, res) ->

res.json 200, req.store.item
# Загружает чары в магазин.
# Загруженные чары являются экземплярами класса `Server.Store.Enchantment`.
, (req, res, next) ->
serverId= req.store.serverId
maria.Server.Store.Enchantment.query serverId, req.maria, (err, enchantments) ->
if not err
req.store.setEnchantments enchantments
next err

# Загружает указанный предмет в магазин.
# Загруженный предмет является экземпляром класса `Server.Store.Item`
, (req, res, next) ->
itemId= req.param 'itemId'
maria.Server.Store.Item.get itemId, req.maria, (err, item) ->
if not err
item= req.store.addItem item
if item.enchantability and item.enchantments
enchantments= []
for enchantment in item.enchantments
enchantments.push req.store.factoryItemEnchantment enchantment
item.enchantments= enchantments
next err

, maria.transaction()

# Списывает стоимость предмета со счета игрока.
, (req, res, next) ->
playerId= req.user.id
orig= req.store.getItem req.body.item
item= req.item= req.store.factoryItem req.body.item
xp= item.calcXp() - orig.calcXp()
price= Math.round( ((xp * 0.03) + orig.price) * 100 ) / 100
price= price * (item.amount / orig.amount)
maria.Player.Balance.dec playerId, price, req.maria, (err) ->
next err

# Сохраняет предмет игроку.
, (req, res, next) ->
playerId= req.user.id
serverId= req.store.serverId
maria.Player.Item.create playerId, serverId, req.item, req.maria, (err, item) ->
item.enchantments= req.item.enchantments
req.item= item
next err

# Сохраняет чары предмета игроку.
, (req, res, next) ->
return do next if not req.item.enchantments
maria.Player.Item.Enchantment.saveItemEnchantments req.item, req.maria, (err, item) ->
req.item= item
next err

, maria.transaction.commit()

, (req, res, next) ->
res.json 201, req.item



Expand Down Expand Up @@ -169,20 +222,47 @@ loadServerStorageEnchantments= (ServerStorageEnchantment) ->

loadServerStorageItems= (ServerStorageItem) ->
(req, res, next) ->
playerId= req.user.id
serverId= req.storage.serverId

console.log 'load server `%s` storage items...', serverId

ServerStorageItem.query serverId, req.maria, (err, items) ->
ServerStorageItem.query playerId, serverId, req.maria, (err, items) ->
req.storage.items= items

if not items and not err
res.status 404
err= 'server storage items not found'
if not err
idx= {}
items= []
for item, i in req.storage.items
if not item.name and not item.enchantability
if not itm= idx[item.itemId]
itm= idx[item.itemId]= item
items.push itm
else
itm.amount= itm.amount + item.amount
else
items.push item
req.storage.items= items
next err

loadServerStorageTags= (ServerTag) ->
(req, res, next) ->
serverId= req.storage.serverId

console.log 'load server `%s` storage tags...', serverId

ServerTag.query serverId, req.maria, (err, tags) ->
req.storage.tags= tags

if not tags and not err
res.status 404
err= 'server storage tags not found'

console.log 'load server storage:', req.storage
next err




loadServerStore= (param, ServerStore) ->
(req, res, next) ->
req.store= null
Expand Down Expand Up @@ -242,6 +322,7 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) ->
for item in req.store.items
if not item.enchantability
continue
item.enchantments= []
if not idx[item.id]
idx[item.id]= item
ids.push item.id
Expand All @@ -268,13 +349,13 @@ loadServerStoreItemsEnchantments= (ServerStoreItemEnchantment) ->
console.log 'load server store:', req.store
next err

loadServerStoreTags= (ServerStoreTag) ->
loadServerStoreTags= (ServerTag) ->
(req, res, next) ->
serverId= req.store.serverId

console.log 'load server `%s` store tags...', serverId

ServerStoreTag.query serverId, req.maria, (err, tags) ->
ServerTag.query serverId, req.maria, (err, tags) ->
req.store.tags= tags

if not tags and not err
Expand All @@ -283,50 +364,3 @@ loadServerStoreTags= (ServerStoreTag) ->

console.log 'load server store:', req.store
next err

loadServerStoreItem= (param, ServerStoreItem) ->
(req, res, next) ->
req.store.item= null

itemId= req.param param

console.log 'load server store item `%d`...', itemId
ServerStoreItem.get itemId, req.maria, (err, item) ->
req.store.item= item
if not item and not err
res.status 404
err= 'server store item not found'

console.log 'load server store:', req.store
next err

loadServerStoreItemEnchantments= (ServerStoreItemEnchantment) ->
(req, res, next) ->

if not req.store.item.enchantability
req.store.item.enchantments= null
return next null

itemId= req.store.item.id

req.store.enchantmentsIdx= {}
for enchantment in req.store.enchantments
if not req.store.enchantmentsIdx[enchantment.id]
req.store.enchantmentsIdx[enchantment.id]= enchantment

console.log 'load server store item `%d` enchantments...', itemId
ServerStoreItemEnchantment.query [itemId], req.maria, (err, enchantments) ->
req.store.item.enchantments= []

if not enchantments and not err
err= 'cannot load store item enchantments'

if not err
ench= null
for ench in enchantments
if enchantment= req.store.enchantmentsIdx[ench.enchantmentId]
req.store.item.enchantments.push extend {}, enchantment,
level: ench.level

console.log 'load server store:', req.store
next err
7 changes: 1 addition & 6 deletions source/node/handlers/index.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,6 @@ app.on 'mount', (parent) ->
app.use '/api/v1/player/subscriptions'
, require './Play/Api/V1/Player/Subscriptions'

###
Методы API для работы игрока с магазином.
###
app.use '/api/v1/store'
, require './Play/Api/V1/Store'

###
Методы API для работы с серверами.
###
Expand All @@ -92,6 +86,7 @@ app.on 'mount', (parent) ->
Обрабатывает ошибку
###
app.use (err, req, res, next) ->
console.log 'ERROR!', err
res.status 500
res.json
name: err.name
Expand Down
10 changes: 9 additions & 1 deletion source/node/index.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ module.exports= (cfg, log, done) ->
return next err if err
req.maria.query 'START TRANSACTION', (err) ->
req.maria.transaction= true if not err

req.on 'end', ->
console.log 'запрос завершен. завершить транзакцию', req.status()

return next err

maria.transaction.commit= () ->
Expand All @@ -110,18 +114,22 @@ module.exports= (cfg, log, done) ->
return next err

maria.Player= require './models/Player'
maria.Player.Balance= require './models/Player/Balance'
maria.Player.Pex= require './models/Player/Pex'
maria.Player.Message= require './models/Player/Message'

maria.Player.Item= require './models/Player/Item'

maria.Server= require './models/Server'
maria.Server.Tag= require './models/Server/Tag'

maria.Server.Storage= require './models/Server/Storage'
maria.Server.Storage.Item= require './models/Server/Storage/Item'

maria.Server.Store= require './models/Server/Store'
maria.Server.Store.Enchantment= require './models/Server/Store/Enchantment'
maria.Server.Store.Item= require './models/Server/Store/Item'
maria.Server.Store.Item.Enchantment= require './models/Server/Store/Item/Enchantment'
maria.Server.Store.Tag= require './models/Server/Store/Tag'

app.use (req, res, next) ->
req.db= app.db
Expand Down
2 changes: 2 additions & 0 deletions source/node/models/Item.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module.exports= class Item
@table= 'item'
27 changes: 27 additions & 0 deletions source/node/models/Player/Balance.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module.exports= class PlayerBalance
@table: 'player_balance'

@dec: (playerId, amount, maria, done) ->

if not amount
err= new Error 'PlayerBalance#amount cannot be NULL'

if err
return done err

maria.query "
UPDATE
?? as PlayerBalance
SET
PlayerBalance.amount = PlayerBalance.amount - ?
WHERE
PlayerBalance.amount >= ? AND
PlayerBalance.playerId = ?
"
, [@table, amount, amount, playerId]
, (err, res) =>

if not err and res.affectedRows != 1
err= 'not enough money'

done err
35 changes: 35 additions & 0 deletions source/node/models/Player/Item.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
Item= require '../Item'

module.exports= class PlayerItem extends Item
@table: 'player_server_item'



constructor: (data) ->
@id= data.id
@playerId= data.playerId
@serverId= data.serverId
@itemId= data.itemId
@amount= data.amount



@Enchantment= require './Item/Enchantment'

@create: (playerId, serverId, data, maria, done) ->
item= new @
playerId: playerId
serverId: serverId
itemId: data.id
amount: data.amount
maria.query "
INSERT INTO
??
SET
?
"
, [@table, item]
, (err, res) ->
if not err
item.id= res.insertId
done err, item
21 changes: 21 additions & 0 deletions source/node/models/Player/Item/Enchantment.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module.exports= class PlayerItemEnchantment
@table: 'player_server_item_enchantment'

@saveItemEnchantments: (item, maria, done) ->
bulk= []
for ench, i in item.enchantments
bulk.push [item.id, ench.id, ench.level, i]
maria.query "
INSERT INTO
??
(
`itemId`, `enchantmentId`, `level`, `order`
)
VALUES
?
"
, [@table, bulk]
, (err, res) ->
if not err and res.affectedRows != item.enchantments.length
err= 'error insert player item enchantments'
done err, item
Loading