diff --git a/.gitmodules b/.gitmodules index 52eebb4..b52e217 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "subprojects/wrenpp"] path = subprojects/wrenpp url = https://alarmpi.no-ip.org/gitan/King_DuckZ/wrenpp.git +[submodule "subprojects/beast"] + path = subprojects/beast + url = https://github.com/boostorg/beast.git diff --git a/meson.build b/meson.build index a51a618..76ad5ba 100644 --- a/meson.build +++ b/meson.build @@ -8,6 +8,8 @@ project('duckticker', 'cpp', full_config_dir = get_option('prefix') / get_option('sysconfdir') compiler_opts = ['-DWRENPP_WITH_NAME_GUESSING'] +beast_include = include_directories('subprojects/beast/include') + subdir('src') #if meson.source_root() != full_config_dir diff --git a/sample_responses.json b/sample_responses.json new file mode 100644 index 0000000..a5a27f0 --- /dev/null +++ b/sample_responses.json @@ -0,0 +1,1798 @@ +{ + "event": "phx_reply", + "payload": { + "response": {}, + "status": "ok" + }, + "ref": "3", + "topic": "webs:markets_bitfinex_USD" +} + +{ + "event": "new_msg", + "payload": { + "data": { + "currency": "USD", + "exchange_name": "bitfinex", + "trade": { + "amount": 0.0486, + "date": 1652471682, + "exchange_name": "bitfinex", + "price": 30072 + } + } + }, + "ref": null, + "topic": "webs:markets_bitfinex_USD" +} + +{ + "event": "new_msg", + "payload": { + "data": { + "currency": "USD", + "depth": { + "price": 30071, + "type": 1, + "volume": -1.4123 + }, + "exchange_name": "bitfinex" + } + }, + "ref": null, + "topic": "webs:markets_bitfinex_USD" +} + +{ + "event": "new_msg", + "payload": { + "data": { + "currency": "USD", + "depth_shot": [ + [ + [ + 27300, + 695.04972892 + ], + [ + 27400, + 695.04953373 + ], + [ + 27500, + 693.46354632 + ], + [ + 27600, + 690.57702434 + ], + [ + 27700, + 675.2377192499999 + ], + [ + 27800, + 673.0658800399999 + ], + [ + 27900, + 671.3799514499999 + ], + [ + 28000, + 668.13026536 + ], + [ + 28100, + 652.6496043799999 + ], + [ + 28200, + 645.6617948499999 + ], + [ + 28300, + 645.1253953299998 + ], + [ + 28400, + 644.1510087499998 + ], + [ + 28500, + 633.3997066599999 + ], + [ + 28560, + 627.9892887599999 + ], + [ + 28570, + 627.9660559299999 + ], + [ + 28590, + 624.9378051599999 + ], + [ + 28600, + 624.9341799299999 + ], + [ + 28600, + 624.9241799299999 + ], + [ + 28610, + 622.8756946399999 + ], + [ + 28620, + 622.8736606199999 + ], + [ + 28630, + 622.8160538399999 + ], + [ + 28640, + 622.8144586599999 + ], + [ + 28650, + 622.6790741299999 + ], + [ + 28660, + 622.6592741299999 + ], + [ + 28670, + 622.5546924999999 + ], + [ + 28680, + 622.5534812399999 + ], + [ + 28690, + 622.5168503499999 + ], + [ + 28700, + 622.4937507199999 + ], + [ + 28710, + 621.4777658099998 + ], + [ + 28720, + 621.4773168099998 + ], + [ + 28730, + 621.4704862099999 + ], + [ + 28740, + 621.4549448199999 + ], + [ + 28750, + 621.4449448199999 + ], + [ + 28760, + 621.2892159899999 + ], + [ + 28770, + 621.2877652099999 + ], + [ + 28780, + 621.2876745599999 + ], + [ + 28790, + 621.2363131199999 + ], + [ + 28800, + 621.2273263699999 + ], + [ + 28810, + 621.1694901299999 + ], + [ + 28820, + 621.1589775599999 + ], + [ + 28830, + 621.10254817 + ], + [ + 28840, + 620.9656886299999 + ], + [ + 28850, + 580.7417394299999 + ], + [ + 28860, + 576.73453407 + ], + [ + 28870, + 576.60787997 + ], + [ + 28880, + 576.57521239 + ], + [ + 28890, + 545.25801657 + ], + [ + 28900, + 545.23518584 + ], + [ + 28910, + 544.9141889599999 + ], + [ + 28920, + 543.8945793299999 + ], + [ + 28930, + 543.89357133 + ], + [ + 28940, + 543.87414925 + ], + [ + 28950, + 518.51615135 + ], + [ + 28960, + 518.0673412799999 + ], + [ + 28970, + 514.5884730299999 + ], + [ + 28980, + 514.4792401499999 + ], + [ + 28990, + 514.44480583 + ], + [ + 29000, + 514.38165695 + ], + [ + 29010, + 493.69949583999994 + ], + [ + 29020, + 493.4886495399999 + ], + [ + 29030, + 493.03920968999995 + ], + [ + 29040, + 493.03526256999993 + ], + [ + 29050, + 492.59692320999994 + ], + [ + 29060, + 489.85506948999995 + ], + [ + 29070, + 489.83562193999995 + ], + [ + 29080, + 489.82005014999993 + ], + [ + 29090, + 489.2393236699999 + ], + [ + 29100, + 489.2294177799999 + ], + [ + 29110, + 488.80416588999987 + ], + [ + 29120, + 488.8006708899999 + ], + [ + 29130, + 488.7857048599999 + ], + [ + 29140, + 488.4680032899999 + ], + [ + 29150, + 487.0627863499999 + ], + [ + 29160, + 487.0465999299999 + ], + [ + 29170, + 487.0445999299999 + ], + [ + 29180, + 484.18537422999987 + ], + [ + 29190, + 470.5810011099999 + ], + [ + 29200, + 470.33094110999986 + ], + [ + 29210, + 463.42815623999985 + ], + [ + 29220, + 463.39545539999983 + ], + [ + 29230, + 451.95870630999985 + ], + [ + 29240, + 451.95720513999987 + ], + [ + 29250, + 451.35720513999985 + ], + [ + 29260, + 451.33518441999985 + ], + [ + 29270, + 451.3328111999986 + ], + [ + 29280, + 451.33266989999987 + ], + [ + 29290, + 451.19126533999986 + ], + [ + 29300, + 441.19471984999984 + ], + [ + 29310, + 441.14571884999987 + ], + [ + 29330, + 440.7911281999999 + ], + [ + 29340, + 438.34335385999987 + ], + [ + 29350, + 438.33940909999984 + ], + [ + 29360, + 437.82745828999987 + ], + [ + 29370, + 437.8184667899999 + ], + [ + 29380, + 437.6728326199999 + ], + [ + 29390, + 437.1511220499999 + ], + [ + 29400, + 437.06810375999993 + ], + [ + 29410, + 430.25551547999993 + ], + [ + 29420, + 429.5740094899999 + ], + [ + 29430, + 427.4175066599999 + ], + [ + 29450, + 427.4173662199999 + ], + [ + 29467, + 424.5846583899999 + ], + [ + 29474, + 421.6730583899999 + ], + [ + 29482, + 420.97315838999987 + ], + [ + 29485, + 420.97170760999984 + ], + [ + 29495, + 418.6313681899998 + ], + [ + 29500, + 415.13216818999985 + ], + [ + 29516, + 413.8763921899998 + ], + [ + 29522, + 410.7123759899998 + ], + [ + 29540, + 410.13647598999984 + ], + [ + 29544, + 410.08065978999986 + ], + [ + 29549, + 410.07607407999984 + ], + [ + 29553, + 410.0746233099998 + ], + [ + 29560, + 404.1840233099998 + ], + [ + 29565, + 403.0343233099998 + ], + [ + 29566, + 400.7278233099998 + ], + [ + 29588, + 400.7128233099998 + ], + [ + 29592, + 398.1913138699998 + ], + [ + 29593, + 397.24607934999983 + ], + [ + 29596, + 391.5701179299998 + ], + [ + 29600, + 391.5700017499998 + ], + [ + 29605, + 391.5630017499998 + ], + [ + 29616, + 391.08870174999976 + ], + [ + 29617, + 391.08725094999977 + ], + [ + 29622, + 388.16435094999974 + ], + [ + 29631, + 388.05561457999977 + ], + [ + 29640, + 388.0456145799998 + ], + [ 29645, + 388.0204385799998 + ], + [ + 29647, + 388.0185867399998 + ], + [ + 29651, + 387.54568673999984 + ], + [ + 29668, + 387.54485168999986 + ], + [ + 29674, + 380.29911728999986 + ], + [ + 29675, + 380.27394128999987 + ], + [ + 29680, + 380.2487652899999 + ], + [ + 29681, + 380.2477652899999 + ], + [ + 29683, + 380.2330498699999 + ], + [ + 29684, + 380.2315990799999 + ], + [ + 29686, + 379.8433990799999 + ], + [ + 29698, + 379.8399829499999 + ], + [ + 29699, + 379.8215390599999 + ], + [ + 29717, + 379.1841390599999 + ], + [ + 29721, + 378.9241390599999 + ], + [ + 29722, + 375.4612390599999 + ], + [ + 29723, + 339.8912390599999 + ], + [ + 29725, + 339.11553905999995 + ], + [ + 29727, + 337.12673165999996 + ], + [ + 29730, + 335.24135994999995 + ], + [ + 29737, + 332.36425994999996 + ], + [ + 29741, + 332.36372790999997 + ], + [ + 29749, + 332.35195190999997 + ], + [ + 29750, + 332.31224327999996 + ], + [ + 29752, + 332.31069249999996 + ], + [ + 29753, + 332.30511249999995 + ], + [ + 29754, + 329.95091249999996 + ], + [ + 29760, + 324.10951249999994 + ], + [ + 29761, + 324.1093736099999 + ], + [ + 29765, + 324.0975976099999 + ], + [ + 29769, + 324.0858216099999 + ], + [ + 29771, + 323.7862216099999 + ], + [ + 29772, + 323.7861608899999 + ], + [ + 29780, + 320.1234396999999 + ], + [ + 29781, + 318.5601336999999 + ], + [ + 29785, + 315.1305336999999 + ], + [ + 29793, + 314.4939336999999 + ], + [ + 29798, + 312.1569336999999 + ], + [ + 29800, + 311.9569336999999 + ], + [ + 29803, + 286.4569336999999 + ], + [ + 29804, + 280.5615336999999 + ], + [ + 29811, + 279.01093369999995 + ], + [ + 29816, + 277.75439496999996 + ], + [ + 29817, + 273.29622718999997 + ], + [ + 29819, + 244.39477637999997 + ], + [ + 29826, + 244.07647637999997 + ], + [ + 29829, + 228.86557637999996 + ], + [ + 29831, + 228.86534274999997 + ], + [ + 29839, + 205.85824274999996 + ], + [ + 29849, + 204.71526489999997 + ], + [ + 29852, + 198.93656489999998 + ], + [ + 29854, + 198.84739427999997 + ], + [ + 29857, + 194.12519211999998 + ], + [ + 29861, + 187.01839212 + ], + [ + 29862, + 186.49649212 + ], + [ + 29863, + 186.49577711999999 + ], + [ + 29867, + 178.03337711999998 + ], + [ + 29872, + 176.99935706 + ], + [ + 29878, + 175.72735706 + ], + [ + 29879, + 164.05375706 + ], + [ + 29884, + 102.05375706000001 + ], + [ + 29885, + 102.05230626000001 + ], + [ + 29886, + 82.05230626000001 + ], + [ + 29887, + 76.58048704000001 + ], + [ + 29888, + 76.58009681000001 + ], + [ + 29889, + 76.57670376000002 + ], + [ + 29892, + 76.49550345000002 + ], + [ + 29894, + 75.66194945000001 + ], + [ + 29895, + 74.61734945 + ], + [ + 29897, + 73.64795565 + ], + [ + 29898, + 73.62424782 + ], + [ + 29900, + 73.62407576999999 + ], + [ + 29902, + 73.29057476999999 + ], + [ + 29903, + 72.95712277 + ], + [ + 29907, + 72.12358077 + ], + [ + 29909, + 72.12029021000001 + ], + [ + 29910, + 72.11802494000001 + ], + [ + 29911, + 71.68982494000001 + ], + [ + 29917, + 69.77063715000001 + ], + [ + 29919, + 69.58193715000002 + ], + [ + 29920, + 69.23519615000002 + ], + [ + 29921, + 69.16244933000002 + ], + [ + 29922, + 68.94824933000001 + ], + [ + 29924, + 68.61444933000001 + ], + [ + 29925, + 67.70968178000001 + ], + [ + 29928, + 67.70917841 + ], + [ + 29931, + 67.53217841 + ], + [ + 29932, + 67.44867829 + ], + [ + 29933, + 67.08570229 + ], + [ + 29934, + 66.74531329 + ], + [ + 29936, + 66.57119887 + ], + [ + 29937, + 65.19179887 + ], + [ + 29939, + 65.01609887 + ], + [ + 29940, + 64.68260787 + ], + [ + 29941, + 63.8488024 + ], + [ + 29944, + 63.66823323 + ], + [ + 29945, + 62.83470823 + ], + [ + 29946, + 61.97810823 + ], + [ + 29947, + 61.13796693 + ], + [ + 29949, + 60.80435893 + ], + [ + 29950, + 60.80409073 + ], + [ + 29951, + 60.786810769999995 + ], + [ + 29952, + 57.60892379999999 + ], + [ + 29954, + 57.604453019999994 + ], + [ + 29956, + 57.50120414999999 + ], + [ + 29957, + 57.34470165999999 + ], + [ + 29958, + 56.67448536999999 + ], + [ + 29959, + 55.805667369999995 + ], + [ + 29960, + 55.70566736999999 + ], + [ + 29961, + 53.75845232999999 + ], + [ + 29962, + 53.42365291999999 + ], + [ + 29963, + 53.42265291999999 + ], + [ + 29964, + 51.88590291999999 + ], + [ + 29966, + 51.88092291999999 + ], + [ + 29968, + 51.70893558999999 + ], + [ + 29969, + 51.37534958999999 + ], + [ + 29970, + 48.047500789999994 + ], + [ + 29971, + 45.684700789999994 + ], + [ + 29973, + 45.350006789999995 + ], + [ + 29974, + 44.567543969999996 + ], + [ + 29975, + 44.56300397 + ], + [ + 29976, + 44.56200397 + ], + [ + 29977, + 43.58725782 + ], + [ + 29978, + 43.58625782 + ], + [ + 61.788244680000005 + ], + [ + 30117, + 65.12283333 + ], + [ + 30119, + 68.45068213 + ], + [ + 30120, + 73.15235941 + ], + [ + 30121, + 76.48675563 + ], + [ + 30122, + 78.28665563 + ], + [ + 30123, + 78.55340862999999 + ], + [ + 30124, + 79.13080862999999 + ], + [ + 30126, + 81.68939576 + ], + [ + 30127, + 85.01956215999999 + ], + [ + 30129, + 90.02625930999999 + ], + [ + 30130, + 94.79697405999998 + ], + [ + 30131, + 94.99807405999998 + ], + [ + 30132, + 98.33266270999998 + ], + [ + 30134, + 99.26866270999999 + ], + [ + 30136, + 102.60415892999998 + ], + [ + 30138, + 103.13903192999999 + ], + [ + 30142, + 103.14013192999998 + ], + [ + 30143, + 103.84323192999999 + ], + [ + 30144, + 104.16914003 + ], + [ + 30145, + 104.17058478999999 + ], + [ + 30149, + 104.17542442999999 + ], + [ + 30150, + 105.34712443 + ], + [ + 30156, + 106.59712443 + ], + [ + 30162, + 106.77262443 + ], + [ + 30163, + 107.12362442999999 + ], + [ + 30164, + 107.98042443 + ], + [ + 30165, + 109.23042443 + ], + [ + 30171, + 114.80905271 + ], + [ + 30176, + 114.86691224 + ], + [ + 30181, + 121.92511224 + ], + [ + 30182, + 149.73734924000001 + ], + [ + 30187, + 150.16514924 + ], + [ + 30191, + 150.54561014 + ], + [ + 30192, + 150.74561014 + ], + [ + 30195, + 163.39591013999998 + ], + [ + 30196, + 163.61011014 + ], + [ + 30197, + 163.62188614 + ], + [ + 30199, + 168.302486139999 350.6854566399998 + ], + [ + 30429, + 350.6945475499998 + ], + [ + 30431, + 350.6947851499998 + ], + [ + 30434, + 350.7038760599998 + ], + [ + 30444, + 353.0293578799998 + ], + [ + 30450, + 353.04075887999977 + ], + [ + 30456, + 353.4661378799998 + ], + [ + 30458, + 353.4913138799998 + ], + [ + 30465, + 353.51648987999977 + ], + [ + 30466, + 353.53096987999976 + ], + [ + 30469, + 354.00366987999973 + ], + [ + 30470, + 354.11216553999975 + ], + [ + 30485, + 354.1123021499998 + ], + [ + 30487, + 354.1137469099998 + ], + [ + 30492, + 358.0015610799998 + ], + [ + 30493, + 360.5973352699998 + ], + [ + 30497, + 360.6973352699998 + ], + [ + 30500, + 362.05843526999985 + ], + [ + 30510, + 364.90717476999987 + ], + [ + 30513, + 364.90757091999984 + ], + [ + 30517, + 364.90774197999986 + ], + [ + 30522, + 365.48878401999985 + ], + [ + 30530, + 365.4888484599999 + ], + [ + 30543, + 365.48905151999986 + ], + [ + 30544, + 368.73429605999985 + ], + [ + 30545, + 368.7348809599998 + ], + [ + 30550, + 369.2199809599998 + ], + [ + 30553, + 369.2201961499998 + ], + [ + 30556, + 369.22164090999985 + ], + [ + 30562, + 372.02894090999985 + ], + [ + 30566, + 372.04394090999983 + ], + [ + 30569, + 372.0572881499998 + ], + [ + 30576, + 373.2089881499998 + ], + [ + 30578, + 373.20911514999983 + ], + [ + 30599, + 373.4091151499998 + ], + [ + 30600, + 373.4191151499998 + ], + [ + 30612, + 373.47114194999983 + ], + [ + 30614, + 373.47158445999986 + ], + [ + 30619, + 373.48570445999985 + ], + [ + 30624, + 373.48730545999985 + ], + [ + 30625, + 373.4887502199999 + ], + [ + 30636, + 373.5169883899999 + ], + [ + 30650, + 373.52798338999986 + ], + [ + 30652, + 376.45578338999985 + ], + [ + 30654, + 376.45591924999985 + ], + [ + 30656, + 383.53846454999984 + ], + [ + 30670, + 383.57150114999985 + ], + [ + 30680, + 383.57208722999985 + ], + [ + 30690, + 384.27448722999986 + ], + [ + 30700, + 385.7301149899999 + ], + [ + 30710, + 385.7303769699999 + ], + [ + 30730, + 385.7347892699999 + ], + [ + 30740, + 385.7352097499999 + ], + [ + 30750, + 395.0213912599999 + ], + [ + 30760, + 395.84582622999994 + ], + [ + 30770, + 405.60831483999993 + ], + [ + 30780, + 405.61432647999993 + ], + [ + 30790, + 405.63059580999993 + ], + [ + 30800, + 407.73629680999994 + ], + [ + 30810, + 407.73667917999995 + ], + [ + 30820, + 407.73681428 + ], + [ + 30830, + 407.73825904 + ], + [ + 30840, + 413.64765904 + ], + [ + 30850, + 413.65873534 + ], + [ + 30860, + 413.71746567 + ], + [ + 30870, + 413.72746567 + ], + [ + 30880, + 413.72826673000003 + ], + [ + 30890, + 414.02826673000004 + ], + [ + 30900, + 426.99529529000006 + ], + [ + 30910, + 426.9992952900001 + ], + [ + 30920, + 427.0001753300001 + ], + [ + 30930, + 427.0480712200001 + ], + [ + 30940, + 427.0824540200001 + ], + [ + 30950, + 430.0117540200001 + ], + [ + 30960, + 434.0875352900001 + ], + [ + 30970, + 434.1447810500001 + ], + [ + 30980, + 435.7415115800001 + ], + [ + 30990, + 435.8966652900001 + ], + [ + 31000, + 439.9449896500001 + ], + [ + 31010, + 443.3425896500001 + ], + [ + 31020, + 443.3429118500001 + ], + [ + 31030, + 443.3529372800001 + ], + [ + 31040, + 443.3553820400001 + ], + [ + 31050, + 468.8194147400001 + ], + [ + 31070, + 468.83545401000015 + ], + [ + 31080, + 468.85573301000016 + ], + [ + 31090, + 468.8607943700002 + ], + [ + 31100, + 469.3309950600002 + ], + [ + 31110, + 469.3326898200002 + ], + [ + 31120, + 469.3330432200002 + ], + [ + 31130, + 495.2633449200002 + ], + [ + 31140, + 495.2788385000002 + ], + [ + 31150, + 532.4772299500002 + ], + [ + 31160, + 537.7417263100001 + ], + [ + 31170, + 576.6269835500001 + ], + [ + 31180, + 576.6310800300001 + ], + [ + 31190, + 576.6427400300001 + ], + [ + 31200, + 576.8363090900001 + ], + [ + 31210, + 576.8579737400001 + ], + [ + 31220, + 583.8590737400001 + ], + [ + 31240, + 583.8896293000001 + ], + [ + 31250, + 585.9048825500001 + ], + [ + 31260, + 585.9303531600001 + ], + [ + 31270, + 585.9503531600001 + ], + [ + 31280, + 585.9610458300001 + ], + [ + 31290, + 586.9435081600001 + ], + [ + 31300, + 587.2450081600001 + ], + [ + 31310, + 587.2510081600001 + ], + [ + 31320, + 590.8110734700001 + ], + [ + 31330, + 592.8692844700001 + ], + [ + 31340, + 592.8915208400001 + ], + [ + 31350, + 592.9879243600001 + ], + [ + 31360, + 592.9897143800001 + ], + [ + 31370, + 598.9860643800001 + ], + [ + 31380, + 598.9870853800002 + ], + [ + 31390, + 601.3210414900002 + ], + [ + 31400, + 602.4904210400002 + ], + [ + 31410, + 602.5046170400002 + ], + [ + 31420, + 602.5091670400002 + ], + [ + 31430, + 602.5132270400002 + ], + [ + 31440, + 602.5786603100001 + ], + [ + 31450, + 602.5886603100001 + ], + [ + 31460, + 605.4812603100002 + ], + [ + 31470, + 605.5076695700002 + ], + [ + 31480, + 605.5087165700002 + ], + [ + 31490, + 605.6127165700002 + ], + [ + 31500, + 606.1404049200002 + ], + [ + 31510, + 606.1555295900001 + ], + [ + 31530, + 608.5817708400001 + ], + [ + 31540, + 608.5897156000001 + ], + [ + 31550, + 608.66203684 + ], + [ + 31560, + 608.67364938 + ], + [ + 31600, + 619.49581686 + ], + [ + 31700, + 620.73313501 + ], + [ + 31800, + 631.30647557 + ], + [ + 31900, + 634.07002054 + ], + [ + 32000, + 638.83675005 + ], + [ + 32100, + 643.81200322 + ], + [ + 32200, + 656.5014491 + ], + [ + 32300, + 658.6303733 + ], + [ + 32400, + 659.71048786 + ], + [ + 32500, + 691.5618261799999 + ], + [ + 32600, + 695.1201035999999 + ], + [ + 32700, + 695.4542757299998 + ], + [ + 32800, + 707.0705397999998 + ], + [ + 32900, + 708.7282736299998 + ] + ] + ], + "exchange_name": "bitfinex" + } + }, + "ref": null, + "topic": "webs:markets_bitfinex_USD" +} diff --git a/src/main.cpp b/src/main.cpp index 5538b62..47d63a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,10 +15,12 @@ * along with duckticker. If not, see . */ -#include "nap/quick_rest.hpp" +#include +#include #include #include #include +#include #include namespace { @@ -29,88 +31,178 @@ foreign class TickerPrice { foreign price foreign currency + foreign exchange + foreign is_valid } class Bitcoinity { - foreign static ticker(currency) + foreign static ticker(currency, exchange) } class App { - construct new(currency) { + construct new(currency, exchange) { _currency = currency + _exchange = exchange } start() { - var price = Bitcoinity.ticker(_currency) - System.print("Ticker: %(price.price) %(price.currency)") + var price = Bitcoinity.ticker(_currency, _exchange) + System.print("Ticker: %(price.price) %(price.currency) on %(price.exchange)") } } -var the_app = App.new("USD") +var the_app = App.new("USD", "kraken") )script"; +class WebsocketReader { + using tcp = boost::asio::ip::tcp; +public: + WebsocketReader (std::string host, + const std::string& port, + const std::string& path, + const std::string& user_agent, + const std::string& message + ); + + ~WebsocketReader(); + + std::string read(); + +private: + boost::asio::io_context m_ioc; + tcp::resolver m_resolver; + boost::beast::websocket::stream m_ws; +}; + +WebsocketReader::WebsocketReader (std::string host, + const std::string& port, + const std::string& path, + const std::string& user_agent, + const std::string& message +) : + m_resolver{m_ioc}, + m_ws{m_ioc} +{ + //see https://www.boost.org/doc/libs/develop/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp + const auto results = m_resolver.resolve(host, port); + auto ep = boost::asio::connect(m_ws.next_layer(), results); + host += ':' + std::to_string(ep.port()); + m_ws.set_option(boost::beast::websocket::stream_base::decorator( + [user_agent](boost::beast::websocket::request_type& req) + { + req.set(boost::beast::http::field::user_agent, user_agent); + } + )); + m_ws.handshake(host, path); + m_ws.write(boost::asio::buffer(message)); +} + +std::string WebsocketReader::read() { + boost::beast::flat_buffer buffer; + m_ws.read(buffer); + return boost::beast::buffers_to_string(buffer.data()); +} + +WebsocketReader::~WebsocketReader() { + m_ws.close(boost::beast::websocket::close_code::normal); +} + class TickerPrice { public: TickerPrice() = default; - TickerPrice (double price, std::string&& currency) : + TickerPrice (double price, std::string&& currency, std::string&& exchange) : m_price(price), - m_currency(std::move(currency)) + m_currency(std::move(currency)), + m_exchange(std::move(exchange)) {} void set_price (double price) { m_price = price; } void set_currency (std::string&& currency) { m_currency = std::move(currency); } + void set_exchange (std::string&& exchange) { m_exchange = std::move(exchange); } double price() const noexcept { return m_price; } const char* currency() const noexcept { return m_currency.c_str(); } + const char* exchange() const noexcept { return m_exchange.c_str(); } + bool is_valid() const noexcept { return not m_exchange.empty(); } private: double m_price{}; std::string m_currency; + std::string m_exchange; }; -TickerPrice ticker_price (std::string_view currency) { - nap::QuickRest qrest{simdjson::SIMDJSON_PADDING}; - qrest.set_user_agent("duckticker"); - qrest.add_post("currency", currency); +TickerPrice ticker_price_bitoinity (std::string_view currency, std::string_view exchange) { + static const TickerPrice error_price {0.0, "", ""}; - auto response = qrest.fetch("https://bitcoinity.org/simple_switch_currency"); - //std::cout << response.body << '\n'; + WebsocketReader websocket{"bitcoinity.org", + "80", + "/webs_bridge/websocket", + std::string(BOOST_BEAST_VERSION_STRING) + " websocket-client-coro", + R"({"topic":"webs:markets_)" + std::string{exchange} + "_" + + std::string{currency} + R"(","event":"phx_join","payload":{},"ref":"3"})" + }; simdjson::ondemand::parser parser; - simdjson::padded_string_view body{response.body, response.body.size() + simdjson::SIMDJSON_PADDING}; - simdjson::ondemand::document doc = parser.iterate(body); - const double price_out = doc["price"]; - const std::string_view currency_out = doc["currency"]; - return {price_out, std::string{currency_out}}; + { + simdjson::padded_string body = websocket.read(); + std::cout << body << '\n'; + if (body.size() == 0) + return error_price; + simdjson::ondemand::document doc = parser.iterate(body); + + if (doc["event"].get_string().value() != "phx_reply" or doc["payload"]["status"].get_string().value() != "ok") + return error_price; + } + + { + double price_out; + std::string currency_out; + std::string exchange_out; + do { + simdjson::padded_string body = websocket.read(); + std::cout << body << '\n'; + simdjson::ondemand::document doc = parser.iterate(body); + auto payload_result = doc["payload"]; + if (payload_result.error()) + return error_price; + simdjson::ondemand::object payload = payload_result; + auto data_result = payload["data"]; + if (data_result.error()) + return error_price; + simdjson::ondemand::object data = data_result; + + simdjson::error_code price_error; + if (not data["depth"].error()) { + price_error = data["depth"]["price"].get(price_out); + } + else if (not data["trade"].error()) { + price_error = data["trade"]["price"].get(price_out); + } + else if (not data["depth_shot"].error()) { + continue; + } + + std::string_view currency_out_view, exchange_out_view; + const auto currency_error = data["currency"].get(currency_out_view); + const auto exchange_error = data["exchange_name"].get(exchange_out_view); + + if (price_error or currency_error or exchange_error) + return error_price; + + currency_out = currency_out_view; + exchange_out = exchange_out_view; + } while (false); + + return {price_out, std::move(currency_out), std::move(exchange_out)}; + } } -void ticker_price_wren (wren::VM& vm) { +void ticker_price_bitcoinity_wren (wren::VM& vm) { TickerPrice* const tp = wren::make_foreign_object(vm, "main"); - *tp = ticker_price(wren::get(vm, 1)); + *tp = ticker_price_bitoinity(wren::get(vm, 1), wren::get(vm, 2)); } class MyWrenConfiguration : public wren::DefConfiguration { public: - wren::foreign_method_t foreign_method_fn( - wren::VM* vm, - std::string_view module, - std::string_view class_name, - bool is_static, - std::string_view signature - ) { - if ("main" == module) { - if (is_static and "Bitcoinity" == class_name and "ticker(_)" == signature) { - return &ticker_price_wren; - } - else if ("TickerPrice" == class_name) { - if (not is_static and "price" == signature) - return wren::make_method_bindable<&TickerPrice::price>(); - else if (not is_static and "currency" == signature) - return wren::make_method_bindable<&TickerPrice::currency>(); - } - } - return nullptr; - } - wren::foreign_class_t foreign_class_fn( wren::VM* vm, std::string_view module, @@ -127,8 +219,14 @@ public: int main() { MyWrenConfiguration config; wren::VM vm(&config, nullptr); - vm.interpret("main", g_script); + vm.callback_manager() + .add_callback(true, "main", "Bitcoinity", "ticker(_,_)", &ticker_price_bitcoinity_wren) + .add_callback(false, "main", "TickerPrice", "price", wren::make_method_bindable<&TickerPrice::price>()) + .add_callback(false, "main", "TickerPrice", "currency", wren::make_method_bindable<&TickerPrice::currency>()) + .add_callback(false, "main", "TickerPrice", "is_valid", wren::make_method_bindable<&TickerPrice::is_valid>()) + .add_callback(false, "main", "TickerPrice", "exchange", wren::make_method_bindable<&TickerPrice::exchange>()); + vm.interpret("main", g_script); wren::call(vm, {"main", "the_app"}, "start"); return 0; diff --git a/src/meson.build b/src/meson.build index d4415a5..8a7e7ed 100644 --- a/src/meson.build +++ b/src/meson.build @@ -10,6 +10,10 @@ wrenpp_dep = dependency('wrenpp', version: '>=0.1.1', default_options: ['wren_with_rand=true'], ) +boost_dep = dependency('boost', version: '>=1.78.0', + modules: ['coroutine', 'filesystem', 'system', 'thread'], +) + simdjson_dep = dependency('simdjson', version: '>=0.5.0', fallback: ['simdjson', 'simdjson_dep'], ) @@ -24,6 +28,10 @@ executable(meson.project_name(), curlcpp_dep, wrenpp_dep, simdjson_dep, + boost_dep, ], cpp_args: compiler_opts, + include_directories: [ + beast_include, + ], ) diff --git a/subprojects/beast b/subprojects/beast new file mode 160000 index 0000000..9d23bec --- /dev/null +++ b/subprojects/beast @@ -0,0 +1 @@ +Subproject commit 9d23bec2bc523223a377582302bd28d04cb514ed diff --git a/subprojects/wrenpp b/subprojects/wrenpp index edd5f27..d985ebc 160000 --- a/subprojects/wrenpp +++ b/subprojects/wrenpp @@ -1 +1 @@ -Subproject commit edd5f27ab2013e7d768fead766274b1a9eab6075 +Subproject commit d985ebc417f80c59fe26200a9e1e677f54ccb9e9