WoW Addon Manager Client  0.0.1-alpha
A p2p World of Warcraft addon manager
addon.cpp
Go to the documentation of this file.
1 //
2 // Created by jordan on 12/23/19.
3 //
4 #include <iostream>
5 #include <boost/regex.hpp>
6 #include <boost/filesystem.hpp>
7 #include <boost/range/iterator_range_core.hpp>
8 #include <boost/archive/binary_oarchive.hpp>
9 #include <libtorrent/file_storage.hpp>
10 #include <libtorrent/settings_pack.hpp>
11 #include <libtorrent/session.hpp>
12 #include <libtorrent/create_torrent.hpp>
13 
14 #include "addon.h"
15 #include "utils.h"
16 #include "httplib.h"
17 
18 
19 
20 Addon Addon::create_addon(const std::string &addon_folder_path) {
21  return Addon{};
22 }
23 
24 Addon::Addon(const int64_t &id, const std::string &addon_name, const std::string &addon_version,
25  const std::string &interface_version, const std::string &addon_note,
26  const WoWVersion &wow_version) {
27  this->m_addonName = addon_name;
28  this->m_interface_version = interface_version;
29  this->m_description = addon_note;
30  this->m_addon_version = addon_version;
31  this->m_wow_version = wow_version;
32 
33 }
34 
35 Addon::Addon(const Json::Value &addon_json) {
36  this->m_addonName = addon_json["name"].asString();
37  this->m_description = addon_json["description"].asString();
38  this->m_addon_version = addon_json["version"].asString();
39  this->m_torrent_info = addon_json["torrent_info"].asString();
40  this->m_wow_version = WoWVersion::Retail;
41 }
42 
43 std::vector<Addon> Addon::get_installed_adddons(const WoWVersion &wow_version) {
44  boost::filesystem::directory_iterator dir_iter;
45  switch (wow_version) {
46  case WoWVersion::Retail:
47  dir_iter = boost::filesystem::directory_iterator("./wam_files/retail");
48  break;
49  case WoWVersion::Classic:
50  dir_iter = boost::filesystem::directory_iterator("./wam_files/classic");
51  break;
52  case WoWVersion::PTR:
53  dir_iter = boost::filesystem::directory_iterator("./wam_files/ptr");
54  break;
55  default:
56  break;
57  }
58  auto addons = std::vector<Addon>{};
59  auto range = boost::make_iterator_range(dir_iter, {});
60  for (const boost::filesystem::directory_entry &entry: range) {
61  std::cout << entry.path().filename() << std::endl;
62  }
63  return addons;
64 }
65 
66 std::string Addon::get_path() const {
67  return this->m_path;
68 }
69 
70 void Addon::set_path(const std::string &path) {
71  this->m_path = path;
72 }
73 
74 std::ostream &operator<<(std::ostream &os, const Addon &addon) {
75  std::stringstream ss;
76  ss << addon.m_addonName << std::endl;
77  ss << addon.m_addon_version << std::endl;
78  ss << addon.m_description << std::endl;
79  ss << addon.m_torrent_info << std::endl;
80  os << ss.str();
81  return os;
82 }
83 
84 void Addon::make_wam(const std::string &folder_path) {
85  this->generate_torrent_info(folder_path);
86 }
87 
89  auto client = make_client();
90  std::vector<Addon> addons{};
91  auto result = client.Get("/api/addons");
92  if(result && result->status == 200) {
93  for (const Json::Value &addon : string_to_json(result->body)) {
94  addons.emplace_back(addon);
95  }
96  Response<std::vector<Addon>> response("200 OK", result->status, addons);
97  return response;
98  }
99  else if (!result){
100  Response<std::vector<Addon>> response("503 Service Unavailable", 503, boost::none);
101  return response;
102  }
103  else {
104  Response<std::vector<Addon>> response(result->body, result->status, boost::none);
105  return response;
106  }
107 
108 }
109 
110 Response<Addon> Addon::get_addon_by_name(const std::string &addon_name) {
111  auto client = make_client();
112  auto result = client.Get(std::string("/api/addons?name=" + addon_name).c_str());
113  if(result && result->status == 200) {
114  Json::Value root = string_to_json(result->body);
115  Addon addon(root);
116  Response<Addon> response("200 OK", result->status, addon);
117  return response;
118  }
119  else if (!result){
120  Response<Addon> response("503 Service Unavailable", 503, boost::none);
121  return response;
122  }
123  else {
124  Response<Addon> response(result->body, result->status, boost::none);
125  return response;
126  }
127 }
128 
129 void Addon::generate_torrent_info(const std::string &filepath) {
130  libtorrent::settings_pack settings;
131  libtorrent::session ses;
132  settings.set_str(libtorrent::settings_pack::user_agent, "wam/" LIBTORRENT_VERSION);
133  ses.apply_settings(settings);
134 
135  auto fs = lt::file_storage();
136  boost::filesystem::recursive_directory_iterator dir_iter{filepath};
137  auto range = boost::make_iterator_range(dir_iter, {});
138  for (const boost::filesystem::directory_entry &entry: range) {
139  if(!boost::filesystem::is_directory(entry)){
140  fs.add_file(entry.path().string(), boost::filesystem::file_size(entry.path()));
141  }
142  }
143 
144  auto t = libtorrent::create_torrent(fs);
145  t.set_comment(this->m_description.c_str());
146  t.set_creator("WAM Client");
147  t.add_tracker("http://192.168.1.14:8081/announce");
148  t.set_priv(true);
149  libtorrent::set_piece_hashes(t, ".");
150  std::ostringstream out("my_torrent.torrent", std::ios_base::binary);
151 
152  bencode(std::ostream_iterator<char>(out), t.generate());
153 
154  this->m_torrent_info = out.str();
155 
156 }
157 
158 std::string Addon::wow_version_to_string(const Addon::WoWVersion &wow_version) {
159  switch(wow_version){
160  case WoWVersion::Retail:
161  return std::string("Retail");
162  case WoWVersion::Classic:
163  return std::string("Classic");
164  case WoWVersion::PTR:
165  return std::string("PTR");
166  default:
167  return std::string("Invalid");
168  }
169 }
170 
171 
172 Addon::WoWVersion Addon::wow_version_to_enum(const std::string &wow_version) {
173  if(wow_version == "Retail")
174  return WoWVersion::Retail;
175  else if(wow_version == "Classic")
176  return WoWVersion::Classic;
177  else if(wow_version == "PTR")
178  return WoWVersion::PTR;
179  else
180  return WoWVersion::Invalid;
181 }
Addon::wow_version_to_string
static std::string wow_version_to_string(const WoWVersion &wow_version)
Definition: addon.cpp:158
Addon::get_addon_by_name
static Response< Addon > get_addon_by_name(const std::string &addon_name)
Definition: addon.cpp:110
Addon::m_path
std::string m_path
Definition: addon.h:30
Addon::get_installed_adddons
static std::vector< Addon > get_installed_adddons(const WoWVersion &wow_version)
Definition: addon.cpp:43
Addon::m_addon_version
std::string m_addon_version
Definition: addon.h:27
Addon::get_path
std::string get_path() const
Definition: addon.cpp:66
utils.h
Addon::m_interface_version
std::string m_interface_version
Definition: addon.h:28
Addon::m_description
std::string m_description
Definition: addon.h:29
Response
Definition: response.h:12
Addon::make_wam
void make_wam(const std::string &folder_path)
Definition: addon.cpp:84
Addon::create_addon
static Addon create_addon(const std::string &addon_folder_path)
Definition: addon.cpp:20
Addon::set_path
void set_path(const std::string &path)
Definition: addon.cpp:70
Addon::WoWVersion
WoWVersion
Definition: addon.h:19
Addon::m_torrent_info
std::string m_torrent_info
Definition: addon.h:31
Addon::wow_version_to_enum
static WoWVersion wow_version_to_enum(const std::string &wow_version)
Definition: addon.cpp:172
Addon::Addon
Addon()=default
Addon::get_remote_addons
static Response< std::vector< Addon > > get_remote_addons()
Definition: addon.cpp:88
Addon::m_wow_version
WoWVersion m_wow_version
Definition: addon.h:32
operator<<
std::ostream & operator<<(std::ostream &os, const Addon &addon)
Definition: addon.cpp:74
addon.h
make_client
httplib::Client make_client()
Definition: utils.cpp:31
string_to_json
Json::Value string_to_json(const std::string &string)
Definition: utils.cpp:15
Addon::generate_torrent_info
void generate_torrent_info(const std::string &filepath)
Definition: addon.cpp:129
Addon
Definition: addon.h:16
Addon::m_addonName
std::string m_addonName
Definition: addon.h:26