-
Notifications
You must be signed in to change notification settings - Fork 0
/
bitvavo.h
246 lines (216 loc) · 6.77 KB
/
bitvavo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#ifndef BITVAVO_H
#define BITVAVO_H
#include "CryptoMarketData.h"
#include "requestHandler.h"
#include "curl/curl.h";
#include <thread>
#include <iostream>
#include <cassert>
#include <array>
const constexpr uint_fast16_t MarketDataSize = 241;/* IMPORTANT: Only Change if there is an error on screen, follow the instructions*/
#ifdef _DEBUG
namespace server {
static std::string serverData;
inline static constexpr size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) noexcept
{
size_t realsize = size * nmemb;
serverData.append((const char*)contents, realsize);
return realsize;
}
};
class bitvavo {
std::thread priceThread;
bool firstTime = true;
bool updatePrice;
CryptoMarketData* crypto_price_data = new CryptoMarketData[server::MarketDataSize];
requestHandler reqHandle;
bool problemFlag = false; //optional if there is no error
std::string targetPrice;
inline void request_data_from_server(const std::string&& api_link) noexcept {
CURL* curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = std::move(curl_easy_init());
curl_easy_setopt(curl, CURLOPT_URL, api_link.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //supports HTTPS requests
server::serverData.clear();
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, server::WriteCallback);
res = std::move(curl_easy_perform(curl));
curl_easy_cleanup(curl);
curl_global_cleanup();
{
if (res != CURLE_OK) {
std::cerr << "Problem Requesting Data From Server\n";
exit(-1);
}
}//optional if you are sure it works removing will enhance performance
++reqHandle;//inc request count after operation
return;
}//can be reused for other functions from the api// use move r-value for performance benefit
inline constexpr void printMarkets() noexcept {
for (uint_fast16_t i = 0; i < server::MarketDataSize; ++i)
std::cout << "Market: " << crypto_price_data[i].get_market() << " | CODE: " << i << "\n";
return;
}
inline constexpr void needsUpdate(const uint_fast16_t& index,const std::string& tempPrice) noexcept {
if (crypto_price_data[index].get_price() != tempPrice)
crypto_price_data[index].update_price(std::move(tempPrice));
return;
}
inline void fix_JSON() noexcept {
request_data_from_server(std::move("https://api.bitvavo.com/v2/ticker/price"));
server::serverData.erase(server::serverData.begin() + 1);//erasing first character
std::string::iterator sr_it = server::serverData.begin();
uint_fast16_t index = 0;
do {
sr_it += 11; //skip
std::string marketTMP;
while (*sr_it != '"') {
marketTMP += *sr_it;
++sr_it;
}
sr_it += 12; //skip
std::string priceTMP;
while (*sr_it != '"') {
priceTMP += *sr_it;
++sr_it;
}
sr_it += 3; //skip
if (firstTime) {
if (index < server::MarketDataSize) {
crypto_price_data[index++].set_market(marketTMP).set_price(priceTMP);
}
else {
++index;
problemFlag = true;
}
}
else{
needsUpdate(index,priceTMP);
++index;
}
} while (sr_it != server::serverData.end());
if(firstTime) {
firstTime = false;
if (problemFlag) {
std::cerr << "YOU MUST CHANGE 'MarketDataSize' Variable To : " << index << " To Solve This Termination\n";
exit(-1);
}//optional if there is no error
printMarkets();
}
return;
}//gives meaning to Json data
public:
inline bitvavo(void) noexcept = default;
bitvavo(bitvavo&&) = delete;
bitvavo(bitvavo&) = delete;
inline void start() noexcept{
reqHandle.start_();
fix_JSON();
++reqHandle;
this->priceThread = std::move(std::thread(std::move([&]() {
updatePrice = true;
do {
reqHandle.mayContinue();
fix_JSON();
} while (updatePrice);
}
)));
}
inline void stop() noexcept{
updatePrice = false;
priceThread.join();
}
inline ~bitvavo() noexcept{
if (updatePrice) {
updatePrice = false;
if (priceThread.joinable())
priceThread.join();
}
delete[] crypto_price_data;
}
};
#else
namespace server {
static std::string serverData;
inline static constexpr size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) noexcept
{
size_t realsize = size * nmemb;
serverData.append((const char*)contents, realsize);
return realsize;
}
};
class bitvavo {
std::thread priceThread;
CryptoMarketData* crypto_price_data = new CryptoMarketData[server::MarketDataSize];
requestHandler reqHandle;
std::string targetPrice;
inline void request_data_from_server(const std::string&& api_link) noexcept {
CURL* curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = std::move(curl_easy_init());
curl_easy_setopt(curl, CURLOPT_URL, api_link.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //supports HTTP with SSL requests
server::serverData.clear();
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, server::WriteCallback);
res = std::move(curl_easy_perform(curl));
curl_easy_cleanup(curl);
curl_global_cleanup();
++reqHandle;
}
inline constexpr void printMarkets() noexcept {
for (uint_fast16_t i = 0; i < server::MarketDataSize; ++i)
std::cout << "Market: " << crypto_price_data[i].get_market() << " | CODE: " << i << "\n";
return;
}
inline constexpr void needsUpdate(const uint_fast16_t& index, const std::string& tempPrice) noexcept {
if (crypto_price_data[index].get_price() != tempPrice)
crypto_price_data[index].update_price(std::move(tempPrice));
return;
}
inline void fix_JSON() noexcept {
request_data_from_server(std::move("https://api.bitvavo.com/v2/ticker/price"));
server::serverData.erase(server::serverData.begin() + 1);//erasing first character
std::string::iterator sr_it = server::serverData.begin();
uint_fast16_t index = 0;
do {
sr_it += 10;
std::string marketTMP;
while (++sr_it; *sr_it != '"')
marketTMP += *sr_it;
sr_it += 11;
std::string priceTMP;
while (++sr_it; *sr_it != '"')
priceTMP += *sr_it;
sr_it += 3;
needsUpdate(index, priceTMP);
++index;
} while (sr_it != server::serverData.end());
printMarkets();
}
public:
inline bitvavo(void) noexcept = default;
bitvavo(bitvavo&&) = delete;
bitvavo(bitvavo&) = delete;
inline void start() noexcept {
reqHandle.start_();
fix_JSON();
++reqHandle;
this->priceThread = std::move(std::thread(std::move([&reqHandle]() {
while (true) {
reqHandle.mayContinue();
fix_JSON();
}
})));
}
inline void stop() noexcept {
priceThread.detach();
}
inline ~bitvavo() noexcept {
if (priceThread.joinable())
priceThread.detach();
delete[] crypto_price_data;
}
};
#endif // BITVAVO_H