From 11b61a712500e34f1e2b5898207b0f2cd304bd93 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Fri, 29 Mar 2019 02:29:18 -0600 Subject: [PATCH] Add location storage to database, add getnearby API to find receivers --- api/actions/nearby.php | 74 +++++++++++++++++++++++++++++++++++++++++ api/apisettings.php | 11 +++++- composer.json | 3 +- composer.lock | 47 +++++++++++++++++++++++++- database.mwb | Bin 10952 -> 11120 bytes 5 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 api/actions/nearby.php diff --git a/api/actions/nearby.php b/api/actions/nearby.php new file mode 100644 index 0000000..4ac7ed7 --- /dev/null +++ b/api/actions/nearby.php @@ -0,0 +1,74 @@ +boundingCoordinates($radius, "miles"); + +// (NPR voice): The following horrible workaround is brought to you by: +// Medoo bugs #797, #828, member stations, and viewers like you +ob_end_flush(); +ob_start(); +$people = $database->debug()->select("accounts", [ + "publicid", + "name", + "username", + "verified", + "latitude", + "longitude" + ], [ + "AND" => [ + 'latitude[>]' => $searchbounds[0]->getLatitudeInDegrees(), + 'latitude[<]' => $searchbounds[1]->getLatitudeInDegrees(), + 'longitude[>]' => $searchbounds[0]->getLongitudeInDegrees(), + 'longitude[<]' => $searchbounds[1]->getLongitudeInDegrees(), + "lastgpsfix[>]" => date("Y-m-d H:i:s", strtotime("-1 hour")), + "type" => 2 + ], + "LIMIT" => 20 + ] +); +$people = $database->query(ob_get_contents())->fetchAll(); +ob_end_clean(); +// No more really bad code allowed past this point + + +$nearby = []; + +foreach ($people as $person) { + $nearby[] = [ + "name" => (empty($person["name"]) ? $person["username"] : $person["name"]), + "username" => $person["username"], + "verified" => $person["verified"] == 1, + "publicid" => $person["publicid"], + "latitude" => $person["latitude"] * 1.0, + "longitude" => $person["longitude"] * 1.0 + ]; +} + +exitWithJson([ + "status" => "OK", + "radius" => $radius, + "bounds" => [ + 0 => [ + "latitude" => $searchbounds[0]->getLatitudeInDegrees(), + "longitude" => $searchbounds[0]->getLongitudeInDegrees() + ], + 1 => [ + "latitude" => $searchbounds[1]->getLatitudeInDegrees(), + "longitude" => $searchbounds[1]->getLongitudeInDegrees() + ], + ], + "nearby" => $nearby +]); diff --git a/api/apisettings.php b/api/apisettings.php index 2cc1a1f..b45a87d 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -65,5 +65,14 @@ $APIS = [ "key" => $keyregex, "id (optional)" => "/[0-9a-z]+/" ] - ] + ], + "getnearby" => [ + "load" => "nearby.php", + "vars" => [ + "key" => $keyregex, + "latitude" => "/-?[0-9]{2}\.[0-9]+/", + "longitude" => "/-?[0-9]{2,3}\.[0-9]+/", + "radius (optional)" => "/[0-9]*\.?[0-9]+/" + ] + ], ]; diff --git a/composer.json b/composer.json index fb37c32..c81c0af 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,8 @@ "type": "project", "require": { "catfan/medoo": "^1.5", - "guzzlehttp/guzzle": "^6.2" + "guzzlehttp/guzzle": "^6.2", + "anthonymartin/geo-location": "^1.0" }, "license": "MPL-2.0", "authors": [ diff --git a/composer.lock b/composer.lock index 07b730a..16e2713 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,53 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "e4e700119f47d2f68b0ed82abaf8c5c6", + "content-hash": "a4330dce069db4d0d962b670496ca8ef", "packages": [ + { + "name": "anthonymartin/geo-location", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/anthonymartin/GeoLocation.php.git", + "reference": "50bf026f069296dfae11aa195d987854b2e75855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/anthonymartin/GeoLocation.php/zipball/50bf026f069296dfae11aa195d987854b2e75855", + "reference": "50bf026f069296dfae11aa195d987854b2e75855", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "class", + "autoload": { + "psr-0": { + "AnthonyMartin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC 3.0" + ], + "authors": [ + { + "name": "Anthony Martin", + "email": "anthony@replaycreative.com", + "homepage": "http://replaycreative.com", + "role": "Developer" + } + ], + "description": "Retrieve bounding coordinates, distances, longitude and latitude with GeoLocation.class.php", + "homepage": "https://github.com/anthonymartin/GeoLocation.php", + "keywords": [ + "bounding coordinates", + "distances", + "geocoding", + "geolocation" + ], + "time": "2016-09-17T18:05:14+00:00" + }, { "name": "catfan/medoo", "version": "v1.6.1", diff --git a/database.mwb b/database.mwb index d0813876b1f93df8b2605fea48e1ffc2b32242f9..9b44091055e2586af70358d63c117aa2837b7821 100644 GIT binary patch literal 11120 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 literal 10952 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

k*_uB83k$9a6$l?;k6avIy_WVdH!36d2Y zvnQBy+25mi2?!QYaaF`d-|)<&mTXz+j$;PrNJ4a$g!0vTV}G(x>9%+Z#*ebuFcijf zrt?TOiR(6yj_vd_0y($9x6XRJ9S`Ps6i-5^u*1I1Ff(yL9(v<&Oy8L4XpEZrlt+jz zd!Avl_+?0aL!4l?t3z)X!9g0iz~o!2nh+9jBzk+8*l;jihR~X*S2UkNmTvo((j_V& z$%xNDIDowA;MX<50dGkU*w(L0SK&chCs}?axVJ}!;r(aRKEU^q6b@W-Li3y&a`GuAQ(093lYM)Q zvVIpf>x?5Ok1`J)VGf1W*OF%bn2>!%IK|N^Js>e(?P2G_PZo{cjoR+bF5II>$-&Dh zkUZo<_fLWHQ+u_^*Xq>o`_^@cg%&-{I%EV}ATO1{;O_D*pqd;tKmE|!Ld{Ia6jLdw zkN34fF~<)vBLuCU?~uOFf~!@`YzUcJe2d5{z6SmGo~OY-w%~=U-?gFEAs*fdkw(9a z-OgLjtaXkUvSE>rToYKb;r&cLs&wKir7%zryZ%lwQ-vb1&}10`&pFOyClAAPZG=Z|ULeeP+V(2#WNy{vMeo9g<4p)%>S>=ib$Nnp zc@`+GhFuC#TJ^FU`2emxa_I8sUU~D7OG)_sRb3U~^@{leS>?YJSzutS**;1%v{86a zpGvHM8sulQb2PQ(;^gE3`@gTjf(3mFx4cUgh>roEehx4&gij-4X2NV{>}JelW^$3K z=!h?gGh*4T^c7LdQ9?7CgO|iaL;tqLkr$N=fmAJ-&%sLRp{vG*wng997QR)gCh>{v z>+|OY9m$SHLh57Wc@Y@bz|N~7bN$-PODeha<^mb#?Vp z5t!2@Ps*L=4MeY%xQTgleB-mDdGqk|We;@iEhkOv2Jw7dF0ZN03&`&xXO*QJyc?&p zv?c;MH>Nl=#&ya~qBK?`ZYXw%Wl2@h32!+um0>$aova;BUBHU#LI2Cj+Q(BpI6oB= zVcWX3=XM72fvHdz41W&>n^{h^N7jxzMi|?+6!3l*p}eWN`=V=YG~lUt@4@-@*yyij zM(68^s1EJ2P5pfve{efOs`wOoO~Dg9QJmXH6TjTk*iSpsY!ZyayM7GS6Mtkft&x&E zTv7|)Z%q*)a^9_K;qAi)Z|0pdzI?`$sK?M^2=073@?S?*DtPJ{ux&uXUEu^(fxr?fF!cXXdq}|n2UAG`f_pcDioR*i8|!6=*Ml$bvRNT zH8GI!1&TVDcFS#2YH}f()q2u3j2sIuKi_mrmZF)J*{MQInB#!bVvYQex03c?@HWo7 zL^V(s$4r2I8xA`UHjGud_|AwVgLWn{5+dm4$rT_JkD{sZBP&8jV8N&egWpHUNHZ?R;`!>I;493c99^r%EyWe7AAsSw+nLe@IeLdYH4oBb>S&I8Qd zUys0_URoazD)QhE7=Zs>%lU~4|2kTN{xSbu+4-O7{~34w9Sa855|sR@5B&#){uA*( zL(qRB+CL-yKR{BEhl2jc3HUsJeA;nZFfd^-MQ?Rg1rlvX7h4l^2U9B&MMpDpI}&3T pQ!8r^a}ri27I^!AMi^a9t<3F>UHM3?%