| @ -0,0 +1,34 @@ | |||||
| <?php | |||||
| $app->get('/', function() use($app) { | |||||
| $res = $app->response(); | |||||
| ob_start(); | |||||
| render('index', array( | |||||
| 'title' => 'Switchboard', | |||||
| 'meta' => '' | |||||
| )); | |||||
| $html = ob_get_clean(); | |||||
| $res->body($html); | |||||
| }); | |||||
| $app->get('/subscription/:hash', function($hash) use($app) { | |||||
| $res = $app->response(); | |||||
| $subscription = db\get_by_col('subscriptions', 'hash', $hash); | |||||
| $feed = db\get_by_id('feeds', $subscription->feed_id); | |||||
| if(!$subscription) { | |||||
| $app->response()->status(404); | |||||
| } else { | |||||
| ob_start(); | |||||
| render('subscription-status', array( | |||||
| 'title' => 'Switchboard', | |||||
| 'meta' => '', | |||||
| 'subscription' => $subscription, | |||||
| 'feed' => $feed | |||||
| )); | |||||
| $html = ob_get_clean(); | |||||
| $res->body($html); | |||||
| } | |||||
| }); | |||||
| @ -0,0 +1,130 @@ | |||||
| body { | |||||
| padding-top: 10px; | |||||
| background: #fff; | |||||
| } | |||||
| body.logged-out { | |||||
| background: white; | |||||
| } | |||||
| .logged-out .jumbotron { | |||||
| background-color: #fffbeb; | |||||
| border: 1px #fff2bc solid; | |||||
| } | |||||
| .header { | |||||
| font-family:; "Helvetica Neue",Helvetica,Arial,sans-serif; | |||||
| font-size: 22px; | |||||
| font-weight: 500; | |||||
| color: #888; | |||||
| border-bottom: 6px #ddd solid; | |||||
| padding-bottom: 4px; | |||||
| } | |||||
| .narrow { | |||||
| max-width: 700px; | |||||
| margin-right: auto; | |||||
| margin-left: auto; | |||||
| } | |||||
| .footer { | |||||
| padding: 0; | |||||
| margin-top: 20px; | |||||
| text-align: center; | |||||
| color: #999; | |||||
| background-color: #f9f9f9; | |||||
| border-top: 1px #e5e5e5 solid; | |||||
| position: absolute; | |||||
| bottom: 0; | |||||
| width: 100%; | |||||
| } | |||||
| .footer .nav { | |||||
| max-width: 700px; | |||||
| margin-right: auto; | |||||
| margin-left: auto; | |||||
| } | |||||
| .footer .credits { | |||||
| padding: 20px; | |||||
| font-size: 12px; | |||||
| } | |||||
| .jumbotron .tagline { | |||||
| font-size: 23px; | |||||
| } | |||||
| .jumbotron p { | |||||
| font-size: 18px; | |||||
| } | |||||
| /** | |||||
| * Bootstrap callouts | |||||
| */ | |||||
| /* Base styles (regardless of theme) */ | |||||
| .bs-callout { | |||||
| margin: 20px 0; | |||||
| padding: 15px 30px 15px 15px; | |||||
| border-left: 5px solid #eee; | |||||
| } | |||||
| .bs-callout h4 { | |||||
| margin-top: 0; | |||||
| } | |||||
| .bs-callout p:last-child { | |||||
| margin-bottom: 0; | |||||
| } | |||||
| .bs-callout code, | |||||
| .bs-callout .highlight { | |||||
| background-color: #fff; | |||||
| } | |||||
| /* Themes for different contexts */ | |||||
| .bs-callout-danger { | |||||
| background-color: #fcf2f2; | |||||
| border-color: #dFb5b4; | |||||
| } | |||||
| .bs-callout-warning { | |||||
| background-color: #fefbed; | |||||
| border-color: #f1e7bc; | |||||
| } | |||||
| .bs-callout-info { | |||||
| background-color: #f0f7fd; | |||||
| border-color: #d0e3f0; | |||||
| } | |||||
| .bs-callout-success { | |||||
| background-color: #dff0d8; | |||||
| border-color: #b5dca5; | |||||
| } | |||||
| .bs-callout-danger h4 { | |||||
| color: #B94A48; | |||||
| } | |||||
| .bs-callout-warning h4 { | |||||
| color: #C09853; | |||||
| } | |||||
| .bs-callout-info h4 { | |||||
| color: #3A87AD; | |||||
| } | |||||
| .bs-callout-success h4 { | |||||
| color: #3c763d; | |||||
| } | |||||
| .bs-callout.pre { | |||||
| font-family: Menlo,Monaco,Consolas,"Courier New",monospace; | |||||
| word-break: break-all; | |||||
| word-wrap: break-word; | |||||
| } | |||||
| @-webkit-keyframes pulsate { | |||||
| 0% {-webkit-transform: scale(0.9, 0.9); opacity: 1.0;} | |||||
| 50% {opacity: 0.0;} | |||||
| 100% {-webkit-transform: scale(1.1, 1.1); opacity: 1.0;} | |||||
| } | |||||
| @ -0,0 +1,27 @@ | |||||
| <div class="narrow"> | |||||
| <div class="jumbotron h-x-app"> | |||||
| <h1><img src="/images/icons/apple-icon-144x144.png" height="72" style="margin-bottom: 13px;" class="u-logo p-name" alt="Switchboard"> Switchboard</h1> | |||||
| <p class="tagline p-summary">Switchboard is a PubSubHubbub 0.4 hub.</p> | |||||
| <p>To publish content using Switchboard as your hub, add the following links to your home page:</p> | |||||
| <p><pre><link rel="self" href="https://example.com/"> | |||||
| <link rel="hub" href="https://switchboard.p3k.io/"></pre></p> | |||||
| <p>Then, send a POST request to <code>https://switchboard.p3k.io/</code> with the following | |||||
| parameters every time you add content to your home page:</p> | |||||
| <p> | |||||
| <ul> | |||||
| <li><code>hub.mode=publish</code></li> | |||||
| <li><code>hub.topic=https://example.com/</code></li> | |||||
| </ul> | |||||
| </p> | |||||
| <p>Read more info about <a href="https://indiewebcamp.com/how-to-push">how to publish and consume using PubSubHubbub</a>.</p> | |||||
| <a href="<?= Config::$base_url ?>/" class="u-url"></a> | |||||
| </div> | |||||
| </div> | |||||
| @ -0,0 +1,65 @@ | |||||
| <!doctype html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <title><?= $this->title ?></title> | |||||
| <meta charset="utf-8"> | |||||
| <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |||||
| <meta name="apple-mobile-web-app-capable" content="yes" /> | |||||
| <!-- standard viewport tag to set the viewport to the device's width | |||||
| , Android 2.3 devices need this so 100% width works properly and | |||||
| doesn't allow children to blow up the viewport width--> | |||||
| <meta name="viewport" content="initial-scale=1.0,user-scalable=no,maximum-scale=1,width=device-width" /> | |||||
| <!-- width=device-width causes the iPhone 5 to letterbox the app, so | |||||
| we want to exclude it for iPhone 5 to allow full screen apps --> | |||||
| <meta name="viewport" content="initial-scale=1.0,user-scalable=no,maximum-scale=1" media="(device-height: 568px)" /> | |||||
| <link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css"> | |||||
| <link rel="stylesheet" href="/bootstrap/css/bootstrap-theme.min.css"> | |||||
| <link href="/font-awesome/css/font-awesome.min.css" rel="stylesheet" media="all"> | |||||
| <link rel="stylesheet" href="/openwebicons/css/openwebicons-bootstrap.css" /> | |||||
| <link rel="stylesheet" href="/css/style.css"> | |||||
| <!-- icon stuff from www.favicongenerator.org --> | |||||
| <link rel="apple-touch-icon" sizes="57x57" href="/images/icons/apple-icon-57x57.png"> | |||||
| <link rel="apple-touch-icon" sizes="60x60" href="/images/icons/apple-icon-60x60.png"> | |||||
| <link rel="apple-touch-icon" sizes="72x72" href="/images/icons/apple-icon-72x72.png"> | |||||
| <link rel="apple-touch-icon" sizes="76x76" href="/images/icons/apple-icon-76x76.png"> | |||||
| <link rel="apple-touch-icon" sizes="114x114" href="/images/icons/apple-icon-114x114.png"> | |||||
| <link rel="apple-touch-icon" sizes="120x120" href="/images/icons/apple-icon-120x120.png"> | |||||
| <link rel="apple-touch-icon" sizes="144x144" href="/images/icons/apple-icon-144x144.png"> | |||||
| <link rel="apple-touch-icon" sizes="152x152" href="/images/icons/apple-icon-152x152.png"> | |||||
| <link rel="apple-touch-icon" sizes="180x180" href="/images/icons/apple-icon-180x180.png"> | |||||
| <link rel="icon" type="image/png" sizes="192x192" href="/images/icons/android-icon-192x192.png"> | |||||
| <link rel="icon" type="image/png" sizes="32x32" href="/images/icons/favicon-32x32.png"> | |||||
| <link rel="icon" type="image/png" sizes="96x96" href="/images/icons/favicon-96x96.png"> | |||||
| <link rel="icon" type="image/png" sizes="16x16" href="/images/icons/favicon-16x16.png"> | |||||
| <link rel="manifest" href="/images/icons/manifest.json"> | |||||
| <meta name="msapplication-TileColor" content="#ffffff"> | |||||
| <meta name="msapplication-TileImage" content="/images/icons/ms-icon-144x144.png"> | |||||
| <meta name="theme-color" content="#ffffff"> | |||||
| <link rel="icon" href="/favicon.ico" type="image/x-icon"> | |||||
| <script src="/js/jquery-1.7.1.min.js"></script> | |||||
| </head> | |||||
| <body role="document"> | |||||
| <div class="page"> | |||||
| <div class="container"> | |||||
| <?= $this->fetch($this->page . '.php') ?> | |||||
| </div> | |||||
| <div class="footer"> | |||||
| <p class="credits"> | |||||
| This code is <a href="https://github.com/aaronpk/Switchboard">open source</a>. | |||||
| Feel free to send a pull request, or <a href="https://github.com/aaronpk/Switchboard/issues">file an issue</a>. | |||||
| </p> | |||||
| </div> | |||||
| </div> | |||||
| </body> | |||||
| </html> | |||||
| @ -0,0 +1,36 @@ | |||||
| <? if($this->subscription->active): ?> | |||||
| <div class="bs bs-callout bs-callout-success">This subscription is active!</div> | |||||
| <? else: ?> | |||||
| <div class="bs bs-callout bs-callout-danger">This subscription is not active</div> | |||||
| <? endif; ?> | |||||
| <table class="table"> | |||||
| <?php $tz = -7 * 3600; ?> | |||||
| <tr> | |||||
| <td>Feed URL (Topic)</td> | |||||
| <td><?= $this->feed->feed_url ?></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>Callback URL</td> | |||||
| <td><?= $this->subscription->callback_url ?></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>Date Subscription was Requested</td> | |||||
| <td><?= $this->subscription->date_requested ? friendly_date($this->subscription->date_requested, $tz) : '' ?></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>Subscription Verification Response (from your server)</td> | |||||
| <td><pre><?= htmlspecialchars($this->subscription->challenge_response) ?></pre></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>Date Subscription was Confirmed</td> | |||||
| <td><?= $this->subscription->date_confirmed ? friendly_date($this->subscription->date_confirmed, $tz) : '' ?></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>Subscription Expiration</td> | |||||
| <td><?= $this->subscription->date_expires ? friendly_date($this->subscription->date_expires, $tz) : '' ?></td> | |||||
| </tr> | |||||
| </table> | |||||