318 lines
16 KiB
HTML
318 lines
16 KiB
HTML
<!DOCTYPE html>
|
|
<html ng-app="weechat" ng-cloak>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title ng-bind-template="WeeChat {{ pageTitle}}"></title>
|
|
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" media="screen">
|
|
<link rel="shortcut icon" type="image/png" href="img/favicon.png" >
|
|
<link href="css/style.css" rel="stylesheet" media="screen">
|
|
<link href="css/glowingbear.css" rel="stylesheet" media="screen">
|
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
|
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.min.js"></script>
|
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular-route.min.js"></script>
|
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular-sanitize.min.js"></script>
|
|
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
|
|
<script type="text/javascript" src="3rdparty/inflate.min.js"></script>
|
|
<script type="text/javascript" src="js/localstorage.js"></script>
|
|
<script type="text/javascript" src="js/weechat.js"></script>
|
|
<script type="text/javascript" src="js/irc-utils.js"></script>
|
|
<script type="text/javascript" src="js/websockets.js"></script>
|
|
<script type="text/javascript" src="js/models.js"></script>
|
|
<script type="text/javascript" src="js/plugins.js"></script>
|
|
<script type="text/javascript" src="3rdparty/bindonce.js"></script>
|
|
<script type="text/javascript" src="3rdparty/favico-0.3.0.min.js"></script>
|
|
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
|
|
</head>
|
|
<body ng-controller="WeechatCtrl" ng-keydown="handleKeyPress($event)">
|
|
<div ng-hide="connected" class="container">
|
|
<h2>
|
|
<img alt="logo" src="img/favicon.png">
|
|
glowing bear
|
|
<small>
|
|
WeeChat web frontend
|
|
</small>
|
|
</h2>
|
|
<div class="alert alert-danger" ng-show="errorMessage">
|
|
<strong>Oh no!</strong> We cannot connect!
|
|
</div>
|
|
<div class="panel-group" id="accordion">
|
|
<div class="panel">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">
|
|
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
|
|
Connection settings
|
|
</a>
|
|
</h4>
|
|
</div>
|
|
<div id="collapseOne" class="panel-collapse collapse in">
|
|
<div class="panel-body">
|
|
<form class="form-signin" role="form">
|
|
<div class="form-group">
|
|
<label class="control-label" for="host">WeeChat relay hostname and port number</label>
|
|
<div class="input-group">
|
|
<input type="text" class="form-control monospace" id="host" ng-model="host" placeholder="Address">
|
|
<input type="text" class="form-control monospace" id="port" ng-model="port" placeholder="9001">
|
|
</div>
|
|
<div class="alert alert-danger" ng-show="passwordError">
|
|
Error: wrong password
|
|
</div>
|
|
<label class="control-label" for="password">WeeChat relay password</label>
|
|
<input type="password" class="form-control monospace" id="password" ng-model="password" placeholder="Password">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" class="checkbox" id="savepassword" ng-model="savepassword">
|
|
Save password in your browser
|
|
</label>
|
|
</div>
|
|
<div class="checkbox">
|
|
<label class="control-label " for="ssl">
|
|
<input type="checkbox" class="" id="ssl" ng-model="ssl">
|
|
Encryption. Read instructions for help
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="control-label" for="port">Lines</label>
|
|
<input type="text" class="form-control monospace" id="lines" ng-model="lines" placeholder="40">
|
|
<p class="help-block">Enter number of lines to sync from WeeChat on connect</p>
|
|
</div>
|
|
<button class="btn btn-lg btn-primary" ng-click="connect()">Connect <i class="glyphicon glyphicon-chevron-right"></i></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="panel">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">
|
|
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">
|
|
Usage instructions
|
|
</a>
|
|
</h4>
|
|
</div>
|
|
<div id="collapseTwo" class="panel-collapse collapse">
|
|
<div class="panel-body">
|
|
<h3>Configuring the relay</h3>
|
|
<div>To start using glowing bear, please enable the relay plugin in your WeeChat client:
|
|
<pre>
|
|
/set relay.network.password yourpassword
|
|
/relay add weechat 9001
|
|
</pre>
|
|
<span class="label label-danger">WeeChat version 0.4.2 or higher is required.</span><br>
|
|
The communication goes directly between your browser and your WeeChat relay in plain text. Check the instructions below for help on setting up encrypted communication.
|
|
Connection settings, including your password, are saved locally in your own browser between sessions.
|
|
|
|
<br>
|
|
<h3>Shortcuts</h3>
|
|
Glowing Bear has a few shortcuts:
|
|
<ul>
|
|
<li>ALT+n: Toggle nicklist</li>
|
|
<li>ALT+l: Focus on input bar</li>
|
|
<li>ALT-[0-9]: Focus on buffer</li>
|
|
<li>ALT-a: Focus on next buffer with activity</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="panel ">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">
|
|
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseThree">
|
|
Encryption instructions
|
|
</a>
|
|
</h4>
|
|
</div>
|
|
<div id="collapseThree" class="panel-collapse collapse">
|
|
<div class="panel-body">
|
|
If you check the encryption box, the communication between browser and WeeChat will be encrypted.<br>
|
|
<strong>Note</strong>: Due to a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=594502">bug</a> encryption will not work in Firefox. Unless you are using a certificate trusted by your browser, you must also first visit the URL https://weechathost:relayport/ to accept the certificate.</p>
|
|
If you want to use an encrypted session you first have to set up the relay using SSL. It is easiest to use a self-signed certificate, which you can create like this:
|
|
<pre>
|
|
$ mkdir -p ~/.weechat/ssl
|
|
$ cd ~/.weechat/ssl
|
|
$ openssl req -nodes -newkey rsa:2048 -keyout relay.pem -x509 -days 365 -out relay.pem
|
|
</pre>
|
|
If WeeChat is already running, you can reload the certificate and private key with these commands:
|
|
<pre>
|
|
/relay sslcertkey
|
|
/relay add ssl.weechat 8000
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="panel" ng-hide="isinstalled">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">
|
|
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseFour">
|
|
Install app
|
|
</a>
|
|
</h4>
|
|
</div>
|
|
<div id="collapseFour" class="panel-collapse collapse">
|
|
<div class="panel-body">
|
|
<p>If you have a very recent version of Firefox you can install the frontend as an app. Click the button to install.</p>
|
|
<button class="btn btn-lg btn-primary" ng-click="install()">Install app <i class="glyphicon glyphicon-chevron-right"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="content" ng-show="connected">
|
|
<div id="topbar" class="horizontal-line">
|
|
<div class="brand">
|
|
<img alt="brand" src="img/favicon.png" title="Connected to {{ host }}:{{ port}}">
|
|
</div>
|
|
<button ng-show="debugMode" ng-click="countWatchers()">Count Watchers</button>
|
|
<div class="title" ng-bind-html="activeBuffer().title | linky:'_blank'"></div>
|
|
<div class="actions pull-right vertical-line-left">
|
|
<div class="dropdown pull-left">
|
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
|
<i class="glyphicon glyphicon-cog"></i>
|
|
<span class="caret"></span>
|
|
</a>
|
|
<ul class="dropdown-menu pull-right">
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="onlyUnread">
|
|
Only show unread
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="notimestamp">
|
|
Hide timestamps
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="noembed">
|
|
Hide embedded content by default
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="hotlistsync">
|
|
Sync hotlist with WeeChat
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="nonicklist">
|
|
Hide nicklist
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="orderbyserver">
|
|
Order channels by server
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
<li class="">
|
|
<form class="form-inline" role="form">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="debugMode">
|
|
Debug Mode
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<a ng-click="disconnect()">
|
|
<i class="glyphicon glyphicon-remove"></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div id="sidebar" class="vertical-line">
|
|
<ul class="nav nav-pills nav-stacked">
|
|
<li class="bufferfilter">
|
|
<form role="form">
|
|
<input class="form-control monospace" type="text" id="bufferFilter" ng-model="search" ng-keydown="handleSearchBoxKey($event)" placeholder="Search">
|
|
</form>
|
|
</li>
|
|
<li class="buffer" ng-class="{'active': content.active }" ng-repeat="(key, content) in buffers | toArray | filter:{fullName:search} | filter:hasUnread | orderBy:predicate">
|
|
<a href="#" ng-click="setActiveBuffer(content.id)" title="{{ content.fullName }}">
|
|
<span class="badge pull-right" ng-hide="content.notification" ng-if="content.unread" ng-bind="content.unread"></span>
|
|
<span class="badge pull-right danger" ng-show="content.notification" ng-bind="content.notification"></span>
|
|
{{ content.indent(predicate) }}{{ content.shortName }}<span ng-hide="content.shortName">{{ content.fullName }}</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div id="bufferlines" class="monospace" ng-class="{'withnicklist': showNicklist}">
|
|
<div id="nicklist" ng-show="showNicklist" class="vertical-line-left">
|
|
<ul class="nicklistgroup list-unstyled" ng-repeat="group in activeBuffer().nicklist">
|
|
<li class="" ng-repeat="nick in group.nicks|orderBy:'name'" ng-click="openQuery(nick.name)">
|
|
<a ng-click="nickAction(nick)"><span ng-class="nick.prefixClasses">{{nick.prefix}}</span><span ng-class="nick.nameClasses">{{nick.name}}</span></a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<table>
|
|
<tbody bindonce ng-repeat="bufferline in (bufferlines = activeBuffer().lines)">
|
|
<tr class="bufferline">
|
|
<td bo-hide="notimestamp" class="time">
|
|
<span class="date" bo-class="{'repeated-time': bufferline.shortTime==bufferlines[$index-1].shortTime}">
|
|
<span class="cof-chat_time cob-chat_time coa-chat_time" bo-text="bufferline.date|date:'HH'"></span><span class="cof-chat_time_delimiters cob-chat_time_delimiters coa-chat_time_delimiters">:</span><span class="cof-chat_time cob-chat_time coa-chat_time" bo-text="bufferline.date|date:'mm'">{{ bufferline.date | date:'mm' }}</span>
|
|
</span>
|
|
</td>
|
|
<td class="prefix"><span bindonce ng-repeat="part in bufferline.prefix" bo-class="part.classes" bo-html="part.text"></span></td>
|
|
<td class="message">
|
|
<span bindonce ng-repeat="part in bufferline.content" class="text" bo-class="part.classes" bo-html="part.text|linky:'_blank'"></span>
|
|
|
|
<div bindonce ng-repeat="metadata in bufferline.metadata">
|
|
<div bo-show="metadata.visible">
|
|
<button class="btn btn-primary pull-right" bo-click="metadata.visible = false" bo-text="'Hide ' + metadata.name">Hide {{ metadata.name }}</button>
|
|
<div bo-html="metadata.content"></div>
|
|
|
|
</div>
|
|
<div bo-hide="metadata.visible">
|
|
<button class="btn pull-right" bo-class="{'btn-warning': metadata.nsfw, 'btn-primary': !metadata.nsfw}" ng-click="metadata.visible = true">Show {{ metadata.name }}</button>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr class="readmarker" ng-if="activeBuffer().lastSeen==$index">
|
|
<td colspan="3">
|
|
<hr id="readmarker">
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="push"></div>
|
|
</div>
|
|
<div id="footer" ng-show="connected">
|
|
<div class="navbar navbar-inverse navbar-fixed-bottom" ng-class="{'withnicklist': showNicklist}">
|
|
<div input-bar></div>
|
|
</div>
|
|
</body>
|
|
</html>
|