Websocket Commands service
Handles external Http requests and potentially forwards them to other services.
Additional configuration can be found in appsettings.json
.
You can overwrite it via Enviroment variables.
Note: the keys represent the JSON path of a value and
:
has to be replaced with__
. egTOPICS:FLIP
becomesTOPICS__FLIP
This is one of the back-end microservices for https://sky.coflnet.com You can get the same data and play around with it by using this project. more info
Some endpoints are exposed via REST, see the open-api docs: https://sky.coflnet.com/api
Deprecatation WARNING The command endpoints are getting deprecated please use the REST-endpoints (/api)
The backend uses a concept called commands
.
All commands are based on the format type
data
as JSON
or MessagePack
. The content of data
depends on the type
and usually is another escaped and base64
encoded json
object.
Example:
{
"type":"auctionDetails",
"data":"2194c8c742b0452d9a3ecd3bd1835013"
}
You can find a bare bone example frontend inside the file test_frontend.html
.
It has no UI and you have to interact with it via the console and the sendData
comand.
sendData("filterFor","ASPECT_OF_THE_END")
"type":"auctionDetails",
"data":"2194c8c742b0452d9a3ecd3bd1835013"
Respnse
"type":"auctionDetailsResponse",
"data":{
"uuid":"2194c8c742b0452d9a3ecd3bd1835013",
"count":64,
"startingBid":10,
"tier":"common",
"category":"blocks",
"itemName":"Cobblestone",
"start":"12:13:00 26.11.2019",
"end":"13:00:00 26.11.2019",
"auctioneer":"8d1c61f0704c4d9ab5f8dfa735247e34",
"profileId":"8d1c61f0704c4d9ab5f8dfa735247e34",
"bids":[],
"anvilUses":0,
"enchantments":[]
}
Finds item Details and returns them
"type":"itemDetails",
"data":"Cobblestone"
Response (unfinished)
{"type":"itemDetailsReponse",
"data":"{\"Name\":\"Cobblestone\",
\"Description\":\"§f§lCOMMON\",
\"IconUrl\":\"https://skyblock-backend.coflnet.com/static/4-0.png\",
\"Category\":\"blocks\",
\"Extra\":\"Cobblestone Cobblestone\",
\"Tier\":\"COMMON\",
\"MinecraftType\":\"Cobblestone\",
\"color\":null}","mId":0}
}
{
"type":"playerAuctions",
"data":"{uuid:"c2e675a014774842a169335019da9f40",amount:1,offset:2}"
}
Response
"type":"playerAuctionsResponse",
"data":[{"uuid":"f177ad57aba64d51aa7bffbed5d5abd7","highestBid":383333,"itemName":"Super Compactor 3000","end":"2019-12-18T00:21:23.3130000Z","bin":false}]
{
"type":"playerBids",
"data":"{uuid:"c2e675a014774842a169335019da9f40",amount:2,offset:2}"
}
Response
"type":"playerBidsResponse",
"data":"[{"highestOwn":10,"highestBid":10,"itemName":"◆ White Spiral Rune I","uuid":"72cf3a968a404c0a8d3090bb65a551ca","end":"2019-12-26T00:25:29.8750000Z","bin":false},
{"highestOwn":661,"highestBid":23131,"itemName":"Tarantula Web","uuid":"050c3a119cdf4c5387c077482d58510c","end":"2019-12-26T00:22:35.2780000Z","bin":false}]"
{
"type":"fullSearch",
"data":"li"
}
Response
data: "[{"name":"Lion","id":"PET_LION","type":"item","iconUrl":"URL",
{"name":"lik0","id":"35a475f5e5ee4e9eb95fba146e2d868a","type":"player","iconUrl":"URL"},
{"name":"lior","id":"12f1abcc952d46b0915fc6b0a067a73b","type":"player","iconUrl":"URL"},
{"name":"lij_","id":"1a55161fddc34b2990faacf2db198434","type":"player","iconUrl":"URL",
{"name":"Liam","id":"2c8e8bb81a5845b9b023e060a0296e15","type":"player","iconUrl":"URL"}]"
type: "searchResponse"
Should be called when a search suggestion (from fullSearch
is selected).
Used to order future search response suggestions.
The values are:
id
the id from fullSearch
type
the type from fullSarch
{
type:"trackSearch",
data:"{"id":"0938d042abba47cfb74db7ad8839f28d","type":"player"}"
}
This command doesn't generate a response
Returns the Name of a player
{
type:"playerName",
data:"0938d042abba47cfb74db7ad8839f28d"
}
Response:
{
type:"nameResponse",
data:"mar0x"
}
Next generation itemPrices. Requires the Tag of the Item in the name field. Returns faster if no filter options are passed.
{
"type":"pricerdicer",
"data":"{"name":"ASPECT_OF_THE_END","filter":{"Enchantment":"sharpness","EnchantLvl":"6"}}"
}
Options for filters are retrievable with getFilter
.
Response:
{
"filterable":true,
"bazaar":false,
filters: ["EndBefore", "EndAfter", "Reforge", "Enchantment", "EnchantLvl"]
"prices":[
...
{"min":1000000,"max":1079960,"avg":1046950,"volume":15141,"time":"2020-12-31T00:00:00.0000000Z"},
{"min":980002,"max":1066680,"avg":1023300,"volume":14537,"time":"2021-01-01T00:00:00.0000000Z"}
]}
Sets a unique connectionId that should be the same if you reconnect. This is used to preserve subscriptions over reopens. It should be saved and reused for at least the session length.
{
"type":"setConId",
"data":"randomUuid"
}
Gets the timestamp until a given user has their Premium subscription expired.
{
"type":"premiumExpiration",
"data":"userId"
}
Response:
{
"type":"premiumExpiration",
"data":"2021-01-04T00:00:00.0000000Z"
}
data
can also be null
if the user never had premium before.
Creates a checkout session for a given product
{
"type":"paymentSession",
"data":"productId"
}
Response:
{
"type":"checkoutSession",
"data":"stripeSessionId"
}
Returns the app version. All caches should be cleared, when the response of this command changes.
{
"type":"version"
"data":""
}
Response
{
"type":"version",
"data":"6"
}
Sets the google account id for this connection. It expects the id_token
of the GoogleLogin response as string parameter. (tokenObj.id_token
)
{
type:"setGoogle",
data:"eyJh..."
}
No response
Subscribes to some event to receive push notifications.
{
type:"subscribe",
data:{"topic":"BOOSTER_COOKIE","price":0,type:1}
}
type
is the following ENUM
enum SubType {
NONE = 0,
PRICE_LOWER_THAN = 1,
PRICE_HIGHER_THAN = 2,
OUTBID = 4,
SOLD = 8,
BIN = 16,
USE_SELL_NOT_BUY = 32
}
List current subscriptions
{
type:"subscriptions",
data:""
}
Response:
type: "subscriptions",
data: "[{"topicId":"BOOSTER_COOKIE","price":0,"type":2}]"
Unsubscribes from a subscription. Expects the format returned by subscriptions
. Will unsubscribe from multiple subscriptions if they are the same.
type:"unsubscribe",
data: {"topic":"BOOSTER_COOKIE","price":0,type:2}
Response:
{
type: "unsubscribed",
data: "1"
}
Returns the amount of remove subscriptions
Adds a device with firebase token to push notification to
{
"addDevice",
data:{"name":"unique name or connectionId",token:"--token--"}
}
Errors:
{
type: "error",
data: "{"Slug":"no_premium","Message":"You need premium to add multiple devices"}"
Multiple devices is currently a premium feature.
Returns an array of known Reforges.
{
type: "getReforges",
data: ""
}
Response:
{
type: "getReforgesResponse",
data: [{label: "None", id: 0},
{label: "Demonic", id: 1},
{label: "Forceful", id: 2},
...
{label: "Any", id: 126}
]
}
Returns an array of known Enchantments with their ids.
{
type: "getEnchantments",
data: ""
}
Response:
{
type: "getReforgesResponse",
data: [{"label":"unknown","id":0},
{"label":"cleave","id":1},
...
{label: "None", id: 98},
{label: "Any", id: 126}
]
}
Get a list of all device of a user
{
type: "getDevices"
}
Requires the SetGoogle Command to be called first
Response:
{type: "devices",
data: [{"conId":null,"name":"","token":"dLS9L9-GkIrJ6gea…RQl1vYxKgo_qGb9qpdU"}]
Deletes a device of an user
{
type: "getDevices",
data: "deviceName"
}
Requires the SetGoogle Command to be called first.
The deviceName is the name
property of the array elements of getDevices.
Also the name
property passed with Command Token
Sends a test notification to a device
{
type:"testNotification",
data: "deviceName"
}
Returns the most recent auction of a filterquery. (5 auctions by default)
{
type:"recentAuctions",
data:{"name":"ASPECT_OF_THE_END","start":1611247400,"reforge":126,"enchantments":[[98,7]]}
}
Response:
{
type:"auctionResponse",
data: [{"end":"2021-01-21T21:39:38.0Z","price":199542,"seller":"6...4e820","uuid":"783f0e381...f02"}]
}
Returns a filter's optons
{
type:"getFilter",
data:"PetLevel"
}
Response:
data: {
longType: "Equal, NUMERICAL"
name: "PetLevel"
options: ["1", "100"]
type: 17
}
In case the filter is marked as NUMERICAL or DATE, the options specify a range. otherwise there should be a dropdown.
The longType
is for reference only it will be removed in the future.
public enum FilterType
{
Equal = 1,
HIGHER = 2,
LOWER = 4,
DATE = 8,
NUMERICAL = 16
}
Unsubscibes from the flipper. should be called when the flipper is no longer visible
{
type:"unsubFlip"
}
Returns a list of recent flips
{
type:"getFlips"
}
Response:
{
type:"flips"
data:[{median: 196000, cost: 170000, uuid: "a25bbaf9e0504a31adc0b63eeb8b502e", name: "Potion Affinity Artifact", volume: 59.999943}]
}
The volume is the 24 hour volume of a given flip item. It is capped at 60 and if it is almost 60 should be noted in the ui that it is "more than 60".
Returns the most recently updated/found players
{
type:"newPlayers"
}
Response:
{
type:"newPlayersResponse"
data:[{name: "ratooon0000",time: "2021-06-11T14:30:17.0000000Z",uuid: "497dda468de744edb1b214be3c269ad5"}]
}
Returns the most recently found items
{
type:"newItems"
}
Response:
{
type:"newItemsResponse"
data:[{icon: "https://sky.coflnet.com/static/261-0.png", name: "Terminator", tag: "TERMINATOR"}]
}
Returns popular/trending sites
{
type:"popularSearches"
}
Response:
{
data:[{title: "display title", url: "/item/STONE"}]
}
Returns just ended auctions
{
type:"endedAuctions"
}
Response:
{
data:[{end: "2021-06-11T19:01:32.0000000Z"
playerName: "SirGli1tchWhales"
price: 0
seller: "f37c9f4dd1504e02a6274a1442717d8c"
uuid: "ca037db34aeb46248f8c482f95bdc616"}]
}
Returns new auctions (recently created)
{
type:"newAuctions"
}
Response:
{
data:[{end: "2021-06-11T19:01:32.0000000Z"
playerName: "Trayyyo"
price: 0
seller: "6b6c790a1cd84c00b94693cd9f3fda42"
uuid: "ca037db34aeb46248f8c482f95bdc616"}]
}
Returns information about referred users
{
type:"getRefInfo"
}
Response:
{
refId:"uniqueId",
count:0,
receivedTime:"timespan",
bougthPremium:0
}
bougthPremium
is the count of users that bought premium. If a referred user buys premium, the user who created the link receives 3 extra days.
Sets the users who referred this user.
Caution: this can only be executed once for every user.
{
type:"setRef",
data:"uniqueId"
}
The uniqueId
has to match refId
from getRefInfo
Filterable command that returns active auctions.
It has the extra option of order
wich determines in what order auctions are returned.
Valid options for order
are:
0
order by relevance, currently same as highest price1
HIGHEST_PRICE2
LOWEST_PRICE4
ENDING_SOON{
type:"activeAuctions",
data:{"name":"ASPECT_OF_THE_END","order":2,"filter":{}}
}
Response:
[{
end: "2021-07-08T19:07:27.0000000Z"
playerName: "Bactar1on"
price: 300000
seller: "69ca793c1feb42ca9bfcc8c1095958ac"
uuid: "aff519437ff842fb9c68acc86d083389"
},...]
Connect an user to a minecraft account to allow for advanced features.
{
type:"conMc",
data:"playerUuid"
}
Response:
{
"bid":123
}
The response is a validation challenge.
The player has to create an auction or bid on another with the last 3 digits set to that value within 10 min to validate the account connection.
Valid Options
123
bid on an auction8439123
bid on an auction123
53123
Returns the filters with options for a given item.
{
type:"filterFor",
data:"ASPECT_OF_THE_END"
}
Response:
[{
longType: "Equal"
name: "Reforge"
options: ["ambered", "ancient", "Auspicious", "awkward", "Bizarre", …]
type: 1
}[
The response is the same as with getFilter
just as an array because all options are returned at once.
It is planned to filter the available options at some point (currently that is not the case)
Get Account information about the currently logged in user (no data required)
{
type:"accountInfo"
}
Response:
{
"email": "email@example.com",
"token": "access token for external use"
"mcId": "mcUUid if connected",
"mcName": "the name of the mcId"
}
Login via another tool that has no google login
{
type:"loginExt",
data:
{
"email", "account email",
"token": "token from accountInfo"
}
}
Response:
"you were logged in"
This will start pushing the command flip
with the same format as getFlips
.
Please see the api endpoint /api/flip/settings/options
for all options
{
"whitelist":[{"tag":"PET_ENDERDRAGON","filter":{"Tier":"LEGENDARY"}}],
"blacklist":[{"tag":"PET_ENDERDRAGON"}],
"minProfit":300000,
"minVolume":5,
"lbin":false,
"filters":{"Bin":"true"}
}
Filter is applied to all flips and can be omitted.
Returns the available cofl coin balance of an user. Response example:
42
Returns available products for purchase Response is the same format as /api/topup/options
Allows the transfer of cofl coins to another user.
{
"email":"user@example.com",
"mcId":"cbf30125749d4134bba377e4f2d3a377",
"reference":"unique reference",
"amount":12345
}
Either email
or mcId
have to be present.
Response example:
{
"type":"success",
"data":"12345"
}
Updates a single flip setting
{
"key":"minProfit",
"value":"5000",
"changer":"(optional)identifier"
}
Specifying no/empty key will return an error with all options.
The command will return a settingsUpdate
on all connections subscribed to flips.
Subscribes to events regarding the current user
no data
Events have the command type event
{
"id": 0,
"reference": "string",
"message": "string",
"sourceType": "string",
"data": { ... },
"user": {
"id": 0,
"userName": "string",
"userId": "string",
"locale": "string"
},
"setings": {
"id": 0,
"confirmDelivery": true,
"playSound": true,
"storeIfOffline": true
},
"timestamp": "2022-05-28T12:07:39.109Z"
}
The content of the event data
depends on the source type.