-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.php
More file actions
128 lines (125 loc) · 4.31 KB
/
index.php
File metadata and controls
128 lines (125 loc) · 4.31 KB
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
<?php
header("Access-Control-Allow-Origin: *");
define("__BUTTERPHP_ALL__","R");
define("__BASE_PATH__","http://packages.0fury.de/");
require_once "./vendor/squarerootfury/butterphp/src/autoload.php";
require_once "./Interfaces.php";
//Include the autload file from /src/
$router = new \BTRRouter();
$router->Route("/", function($php){
http_response_code(406);
});
$router->Route("/package/",function($php){
//Abort if now package name is provided
if (!property_exists($php->get,"name")){
NotFound();
}
$needle = strtolower($php->get->name);
if (file_exists("./vendor/gethitchhike/units/".$needle."/")){
PackageInfo($needle);
Ping($php);
}
else{
NotFound();
}
},array("name"));
$router->Route("/list/",function($php){
$files = array_values(array_filter(scandir("./vendor/gethitchhike/units"),function($x){
return $x != "." && $x != ".." && $x != ".git" && $x != "composer.json";
}));
echo json_encode($files);
});
$router->Route("/trending/",function($php){
echo json_encode(Trending(),JSON_PRETTY_PRINT);
});
$router->Execute();
function PackageInfo($packagename){
require_once "./vendor/gethitchhike/units/$packagename/".$packagename.".src";
$foo = new $packagename();
$fileList = array();
$filesFromUnit = $foo->GetFiles();
foreach($filesFromUnit as $file){
$path = str_replace(".php",".src",__BASE_PATH__."vendor/gethitchhike/units/$packagename/".$file);
$fileList[] = $path;
}
$output = new \stdClass();
$output->Name = $packagename;
$output->Description = $foo->GetName();
$output->Requires = $foo->Requires();
$output->Version = $foo->GetVersion();
$output->Tags = GetHashTags($output->Description);
$output->Description = preg_replace("/\#(?<hashtag>[^\s]+)/", "", $output->Description);
$output->Files = $fileList;
$output->Hits = HitsForPackage($packagename);
$output->Downloads = DownloadsForPackage($packagename);
echo json_encode($output,JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
function SetUp(){
$db = new PDO('sqlite:./meta.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("CREATE TABLE IF NOT EXISTS stats (
id INTEGER PRIMARY_KEY,
timestamp INTEGER,
target TEXT,
UserAgent TEXT)");
}
function Ping($php){
if (!file_exists("./meta.sqlite")){
Setup();
}
$db = new PDO('sqlite:./meta.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert = "INSERT INTO stats (timestamp,target,UserAgent)
VALUES (:timestamp,:target,:ua)";
$stmt = $db->prepare($insert);
$stmt->bindParam(':timestamp', time());
$stmt->bindValue(':target',$php->get->name);
$stmt->bindValue(':ua',$_SERVER["HTTP_USER_AGENT"]);
$stmt->execute();
}
function Trending(){
$db = new PDO('sqlite:./meta.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "Select target,(Select count(timestamp) from Stats where target = s.target) as hits,(Select count(timestamp) from Stats where target = s.target and UserAgent like 'hm%') as downloads from stats s group by target order by hits, downloads desc";
$stmt = $db->prepare($query);
$stmt->execute();
$got = $stmt->fetchAll();
$data = array();
foreach($got as $value){
$obj = new \stdClass();
$obj->Hits = (int)$value["hits"];
$obj->Downloads = (int)$value["downloads"];
$data[$value["target"]] = $obj;
}
return $data;
}
function HitsForPackage($name){
$db = new PDO('sqlite:./meta.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "Select count(timestamp) as hits from stats where target = :target";
$stmt = $db->prepare($query);
$stmt->bindParam(':target', $name);
$stmt->execute();
$got = $stmt->fetchAll();
return (int)$got[0]["hits"];
}
function DownloadsForPackage($name){
$db = new PDO('sqlite:./meta.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "Select count(timestamp) as downloads from stats where target = :target and UserAgent like 'hm%'";
$stmt = $db->prepare($query);
$stmt->bindParam(':target', $name);
$stmt->execute();
$got = $stmt->fetchAll();
return (int)$got[0]["downloads"];
}
function GetHashTags($string){
$matches = array();
$pattern ="/\#(?<hashtag>[^\s]+)/";
preg_match_all($pattern, $string, $matches);
return $matches["hashtag"];
}
function NotFound(){
header("HTTP/1.0 404 Not Found");
die();
}