June 11th 2015: Work is in progress. Some bits might not run smoothly (broken) on ZNC v.1.7-git as of now. Hang in there.
### Original source
https://github.com/FirrreHQ/zncstrap
### To-Do
No updates for over 5 years and firrre stopped hosting as far as I know
- The user setings page is way too long. Find a way to make it short yet organized
- Clean out the codes and align accordingly
- Swap to a switch-like checkbox
- Test Google Charts to output traffic data, visually
- Tables should be made more responsive, able to view on smaller devices
### Screenshot
Please see [Screenshot](./screenshot.png 'screenshot')
### Installing zncstrap
Step 1 - Get a latest version of zncstrap. Branches are split in the versions that it should work with. The "main" branch should be on the latest version, but no guarantees.
Step 2 - We strongly advice you to make backups of your current ZNC setup (config files and folders, just to be on the safe-side) before you proceed to install zncstrap theme. Once you have your backups stored elsewhere, you can proceed to remove the default theme(s) webskins and modules folder.
You can do so by pointing to /home/username/znc/share/znc, or generally $datadir/share/znc. If you have installed ZNC through a software package manager such as: Advanced Packaging Tool (Apt) or Yellowdog Updater, Modified (yum). You will need to navigate to /usr/local/share/znc/ or /usr/share/znc as the webskins static files resides there (file directries may vary). If all else fails, try using the 'whereis' tool on Linux. You can do so by executing the following command in your terminal / console: whereis znc
Step 3 - Navigate to the above mentioned directory and delete/move the 'modules' & 'webskins' directories, not doing this can cause odd results.
Step 4 - Once it has completely removed, you can now go ahead and upload all zncstrap files that you have downloaded from the GitHub repository.
Once completed, you're good to go! - Login to your web-interface http://ip:port or http://domain.tld:port via any of your preferred web browsers.
### FAQ
**Q: Why can't zncstrap work alongside the default ZNC themes itself?**
A: Mainly because the different HTML tags and attributes used in zncstrap, as part of Twitter Bootstrap specifically in "~/znc/share/znc/modules/webadmin/tmpl" (e.g http://git.io/qj8MKg to http://git.io/SofsZg). If it had been left un-edited, it will not be visually pleasing and would be looking all off-margin. As the CSS bits are different and varies. Hence why the default ZNC themes should be removed as it will no longer serve any good when zncstrap is installed.
**Q: I installed zncstrap, but it is off-margin and un-styled!**
A: You should overwrite everything from '~/zncstrap/modules' to "~/share/znc/modules" or "/usr/local/share/znc/modules" on your machine.
<div class="panel-heading"><? FORMAT "Certificate" ?></div>
<div class="panel-heading">Certificate</div>
<div class="panel-body">
<? IF Cert ?>
<? SETBLOCK DELLINK ?><a href="<? VAR URIPrefix TOP ?><? VAR ModPath ?>delete"><? FORMAT "here" "TRANSLATORS: this text is inserted into `click here` in the other string"?></a><? ENDSETBLOCK ?>
<div class="alert alert-success"><? FORMAT "You already have a certificate set, use the form below to overwrite the current certificate. Alternatively click {1} to delete your certificate." "DELLINK ESC=" "TRANSLATORS: {1} is `here`, translateable in the other string" ?></div>
<div class="alert alert-success">You already have a certificate set, use the form below to overwrite the current certificate. Alternatively click <a href="<? VAR URIPrefix TOP ?><? VAR ModPath ?>delete">here</a> to <a href="<? VAR URIPrefix TOP ?><? VAR ModPath ?>delete">delete</a> your certificate.</div>
<? ELSE ?>
<div class="alert alert-danger"><? FORMAT "You do not have a certificate yet." ?></div>
<div class="alert alert-danger">You do not have a cert.</div>
<? ENDIF ?>
<form class="form-horizontal" method="post" action="<? VAR URIPrefix TOP ?><? VAR ModPath ?>update">
<? INC _csrf_check.tmpl ?>
<div class="form-group">
<label for="inputPEM" class="col-sm-2 control-label"><? FORMAT "PEM File:"?></label>
<div class="alert alert-warning"><? FORMAT "You have no notes to display." ?></div>
<div class="alert alert-warning">You have no notes to display.</div>
<? ELSE ?>
<table class="table table-bordered table-hover">
<thead>
<tr>
<td><? FORMAT "Key" ?></td>
<td><? FORMAT "Note" ?></td>
<td></td>
<td>Key</td>
<td>Note</td>
<td>Action</td>
</tr>
</thead>
<tbody>
@ -39,7 +38,7 @@
<tr>
<td><? VAR Key ?></td>
<td><? VAR Note ?></td>
<td><a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>delnote?key=<? VAR Key ESC=URL,HTML ?>" class="btn btn-danger btn-xs"><? FORMAT "[del]" ?></a></td>
<td><a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>delnote?key=<? VAR Key ESC=URL,HTML ?>" class="btn btn-danger btn-xs">Delete</a></td>
<input type="checkbox" name="<? VAR Name ?>" id="opt_<? VAR Name ?>" value="1" class="cmn-toggle cmn-toggle-round-flat"<? IF Checked ?> checked="checked"<? ENDIF ?><? IF Disabled ?>disabled="disabled"<? ENDIF ?>"/>
<input type="text" class="form-control" id="inputSASLPassword" name="username" placeholder="<? FORMAT "Please enter a password." ?>" autocomplete="off">
<input type="text" class="form-control" id="inputSASLPassword" name="username" placeholder="Enter a Password" autocomplete="off">
</div>
</div>
</div>
<div class="form-group">
<label for="inputSASLUsername" class="col-sm-2 control-label"><? FORMAT "Options" ?></label>
<input type="test" class="form-control" id="inputlabelKey" name="key" value="<? VAR Key ?>" placeholder="<? FORMAT "The password of the channel, if there is one." ?>">
<input type="test" class="form-control" id="inputlabelKey" name="key" value="<? VAR Key ?>" placeholder="The password of the channel, if there is one.">
</div>
</div>
<div class="form-group">
<label for="inputlabelBufferCount" class="col-sm-2 control-label"><? FORMAT "Buffer Size:" ?></label>
<input type="text" class="form-control" id="inputDefaultModes" name="defmodes" value="<? VAR DefModes ?>" size="10" placeholder="<? FORMAT "The default modes of the channel." ?>">
<input type="text" class="form-control" id="inputDefaultModes" name="defmodes" value="<? VAR DefModes ?>" size="10" placeholder="The default modes of the channel.">
<input class="btn btn-success"type="submit" name="submit_return" value="<? IF Edit ?><? FORMAT "Save and return" ?><? ELSE ?><? FORMAT "Add Channel and return" ?><? ENDIF ?>" />
<input class="btn btn-default"type="submit" name="submit_continue" value="<? IF Edit ?><? FORMAT "Save and continue" ?><? ELSE ?><? FORMAT "Add Channel and continue" ?><? ENDIF ?>" />
<div class="tab-pane fade in active" id="netinfotab">
<? IF Edit ?>
<? SETBLOCK ClientConnectHint_Password ?><? VAR Username ?>/<? VAR Name ?>:<? FORMAT "<password>" ?><? ENDSETBLOCK ?>
<? SETBLOCK ClientConnectHint_Username ?><? VAR Username ?>/<? VAR Name ?><? ENDSETBLOCK ?>
<? ELSE ?>
<? SETBLOCK ClientConnectHint_Password ?><? VAR Username ?>/<? FORMAT "<network>" ?>:<? FORMAT "<password>" ?><? ENDSETBLOCK ?>
<? SETBLOCK ClientConnectHint_Username ?><? VAR Username ?>/<? FORMAT "<network>" ?><? ENDSETBLOCK ?>
<? ENDIF ?>
<div class="alert alert-warning"><? FORMAT "To connect to this network from your IRC client, you can set the server password field as <code>{1}</code> or username field as <code>{2}</code>" "ClientConnectHint_Password ESC=" "ClientConnectHint_Username ESC=" ?></div>
<div class="alert alert-info"><? FORMAT "Nick, AltNick, Ident, RealName, BindHost can be left empty to use the value from the user." ?></div>
<div class="alert alert-warning">To connect to this network from your IRC client, you can set the server password field as follows: <code><? VAR Username ?>/<? IF Edit ?><? VAR Name ?><? ELSE ?><network><? ENDIF ?>:<password></code> or username field as <code><? VAR Username ?>/<? IF Edit ?><? VAR Name ?><? ELSE ?><network><? ENDIF ?></code></div>
<div class="alert alert-info">Nick, AltNick, Ident, RealName, BindHost can be left empty to use the value from the user.</div>
<div class="form-group">
<label for="inputNetworkName" class="col-sm-2 control-label"><? FORMAT "Network Name:" ?></label>
<input type="text" class="form-control" id="inputNetworkName" name="name" value="<? VAR Name ?>" maxlength="20" placeholder="<? FORMAT "The name of the IRC network." ?>">
<input type="text" class="form-control" id="inputNetworkName" name="name" value="<? VAR Name ?>" maxlength="20" placeholder="The name of the IRC network">
</div>
</div>
<div class="form-group">
<label for="inputNickname" class="col-sm-2 control-label"><? FORMAT "Nickname:" ?></label>
<input type="text" class="form-control" id="inputNickname" name="nick" value="<? VAR Nick ?>" maxlength="30" placeholder="<? FORMAT "Your nickname on IRC." ?>">
<input type="text" class="form-control" id="inputNickname" name="nick" value="<? VAR Nick ?>" maxlength="30" placeholder="Your nickname on IRC.">
</div>
</div>
<div class="form-group">
<label for="inputAltNickname" class="col-sm-2 control-label"><? FORMAT "Alt. Nickname:" ?></label>
<input type="text" class="form-control" id="AltNickname" name="altnick" value="<? VAR AltNick ?>" maxlength="30" placeholder="<? FORMAT "Your secondary nickname, if the first is not available on IRC." ?>">
<input type="text" class="form-control" id="AltNickname" name="altnick" value="<? VAR AltNick ?>" maxlength="30" placeholder="Your secondary nickname, if the first is not available on IRC.">
</div>
</div>
<div class="form-group">
<label for="inputIdent" class="col-sm-2 control-label"><? FORMAT "Ident:" ?></label>
<input type="text" class="form-control" id="inputQuit" name="quitmsg" value="<? VAR QuitMsg ?>" maxlength="256" placeholder="<? FORMAT "You may define a Message shown, when you quit IRC." ?>">
<input type="text" class="form-control" id="inputQuit" name="quitmsg" value="<? VAR QuitMsg ?>" maxlength="256" placeholder="You may define a Message shown, when you quit IRC.">
</div>
</div>
<div class="form-group">
<label for="inputActive" class="col-sm-2 control-label"><? FORMAT "Active:" ?></label>
<label for="inputTrustedSSL" class="col-sm-2 control-label"><? FORMAT "SHA-256 fingerprints of trusted SSL certificates of this IRC network:" ?></label>
<label for="inputTrustedSSL" class="col-sm-2 control-label">Trusted SSL fingerprints of this IRC network:</label>
<div class="col-sm-10">
<textarea class="form-control" name="fingerprints" rows="3"><? LOOP TrustedFingerprints ?><? VAR FP ?>
<? ENDLOOP ?></textarea>
<span class="help-block"><? FORMAT "When these certificates are encountered, checks for hostname, expiration date, CA are skipped" ?></span>
<span class="help-block">When these certificates are encountered, checks for hostname, expiration date, CA are skipped</span>
</div>
</div>
</div> <!-- Network Info -->
@ -174,41 +143,38 @@
<!-- Flood Protection -->
<div class="tab-pane fade" id="floodprotab">
<div class="form-group">
<label for="floodprotection" class="col-sm-2 control-label"><? FORMAT "Flood protection:" ?></label>
<span class="help-block"><? FORMAT "You might enable the flood protection. This prevents “excess flood” errors, which occur, when your IRC bot is command flooded or spammed. After changing this, reconnect ZNC to server." ?></span>
<span class="help-block">You might enable the flood protection. This prevents `excess flood' errors, which occur, when your IRC bot is command flooded or spammed. After changing this, reconnect ZNC to server</span>
</div>
</div>
</div>
<div class="form-group">
<label for="floodprorate" class="col-sm-2 control-label"><? FORMAT "Flood protection rate:" ?></label>
<input class="form-control" type="number" name="floodrate" min="0.3" step="0.05" id="floodrate" placeholder="<? FORMAT "The number of seconds per line. After changing this, reconnect ZNC to server." ?>" <? IF FloodProtection ?> value="<? VAR FloodRate ?>" <? ELSE ?> value="1.00" disabled="disabled" <? ENDIF ?> />
<? FORMAT "{1} seconds per line" "FloodInputField_Rate ESC=" ?>
<span class="help-block"><? FORMAT "The number of seconds per line. After changing this, reconnect ZNC to server." ?></span>
<input class="form-control" type="number" name="floodrate" min="0.3" step="0.05" id="floodrate" placeholder="The number of seconds per line." <? IF FloodProtection ?> value="<? VAR FloodRate ?>" <? ELSE ?> value="1.00" disabled="disabled" <? ENDIF ?> />
<span class="help-block">The number of seconds per line. After changing this, reconnect ZNC to server</span>
</div>
</div>
<div class="form-group">
<label for="floodproburst" class="col-sm-2 control-label"><? FORMAT "Flood protection burst:" ?></label>
<? FORMAT "{1} lines can be sent immediately" "FloodInputField_Burst ESC=" ?>
<span class="help-block"><? FORMAT "Defines the number of lines, which can be sent immediately. After changing this, reconnect ZNC to server." ?></span>
<td><a href="<? VAR ModPath TOP ?>addchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Name ESC=URL ?>" class="btn btn-primary btn-xs"><? FORMAT "Add" ?></a></td>
<td><a href="addchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Name ESC=URL ?>" class="btn btn-primary btn-xs">Add</a></td>
<? IF ChannelLoop ?>
<th><? FORMAT "Save" ?></th>
<th><? FORMAT "Name" ?></th>
<th><? FORMAT "CurModes" ?></th>
<th><? FORMAT "DefModes" ?></th>
<th><? FORMAT "BufferSize" ?></th>
<th><? FORMAT "Options" ?></th>
<td>Save</td>
<td>Name</td>
<td>CurModes</td>
<td>DefModes</td>
<td>BufferCount</td>
<td>Options</td>
<? ELSE ?>
<td><? FORMAT "← Add a channel (opens in same page)" ?></td>
<td><- Add a channel (opens in same page)</td>
<? ENDIF ?>
</tr>
</thead>
@ -252,9 +217,7 @@
<? LOOP ChannelLoop SORTASC=Name ?>
<tr>
<td>
<input type="hidden" name="channel" value="<? VAR Name ?>" />
<a href="<? VAR ModPath TOP ?>editchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Network ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-warning btn-xs"><? FORMAT "Edit" ?></a>
<a href="<? VAR ModPath TOP ?>delchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Network ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-danger btn-xs"><? FORMAT "Del" ?></a>
<input type="hidden" name="channel" value="<? VAR Name ?>" /> <a href="editchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Network ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-warning btn-xs">Edit</a> <a href="delchan?user=<? VAR Username ESC=URL ?>&network=<? VAR Network ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-danger btn-xs">Del</a>
<input class="btn btn-success" type="submit" name="submit_return" value="<? IF Edit ?><? FORMAT "Save and return" ?><? ELSE ?><? FORMAT "Add Network and return" ?><? ENDIF ?>" />
<input class="btn btn-default" type="submit" name="submit_continue" value="<? IF Edit ?><? FORMAT "Save and continue" ?><? ELSE ?><? FORMAT "Add Network and continue" ?><? ENDIF ?>" />
<input type="text" class="form-control" id="inputUsername" name="user" value="<? VAR Username ?>" placeholder="<? FORMAT "Please enter a username." ?>" autocomplete="off" />
<input type="text" class="form-control" id="inputUsername" name="user" value="<? VAR Username ?>" placeholder="Enter a username" autocomplete="off" />
<? ENDIF ?>
</div>
</div>
<div class="form-group">
<label for="inputPassword" class="col-sm-2 control-label"><? FORMAT "Password:" ?></label>
<input type="password" class="form-control" id="inputPassword" name="password" placeholder="<? FORMAT "Please enter a password." ?>" autocomplete="off">
<input type="password" class="form-control" id="inputPassword" name="password" placeholder="Enter a secure password" autocomplete="off">
</div>
</div>
<div class="form-group">
<label for="inputPassword2" class="col-sm-2 control-label"><? FORMAT "Confirm password:" ?></label>
<div class="alert alert-info help-block"><? FORMAT "Leave empty to allow connections from all IPs.<br/>Otherwise, one entry per line, wildcards * and ? are available." ?></div>
<div class="alert alert-info help-block">Leave empty to allow connections from all IPs. Otherwise, one entry per line, wildcards * and ? are available.</div>
<input type="text" class="form-control" id="inputNickname" name="nick" value="<? VAR Nick ?>" maxlength="30" placeholder="<? FORMAT "Your nickname on IRC." ?>">
<input type="text" class="form-control" id="inputNickname" name="nick" value="<? VAR Nick ?>" maxlength="30" placeholder="This will be your nickname on IRC.">
</div>
</div>
<div class="form-group">
<label for="inputaltNickname" class="col-sm-2 control-label"><? FORMAT "Alt. Nickname:" ?></label>
<input type="text" class="form-control" id="inputaltNickname" name="altnick" value="<? VAR AltNick ?>" maxlength="128" placeholder="<? FORMAT "Your secondary nickname, if the first is not available on IRC." ?>">
<input type="text" class="form-control" id="inputaltNickname" name="altnick" value="<? VAR AltNick ?>" maxlength="128" placeholder="If the nickname above is not available anymore, then this will be your nickname on IRC.">
</div>
</div>
<div class="form-group">
<label for="inputIdent" class="col-sm-2 control-label"><? FORMAT "Ident:" ?></label>
<input type="text" class="form-control" id="inputIdent" name="ident" value="<? VAR Ident ?>" maxlength="128" placeholder="<? FORMAT "The Ident is sent to server as username." ?>">
<input type="text" class="form-control" id="inputIdent" name="ident" value="<? VAR Ident ?>" maxlength="128" placeholder="The Ident identifies you as one specific user of your host.">
</div>
</div>
<div class="form-group">
<label for="inputStatusPrefix" class="col-sm-2 control-label"><? FORMAT "Status Prefix:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputStatusPrefix" name="statusprefix" value="<? VAR StatusPrefix ?>" maxlength="5" placeholder="<? FORMAT "The prefix for the status and module queries." ?>">
<input type="text" class="form-control" id="inputStatusPrefix" name="statusprefix" value="<? VAR StatusPrefix ?>" maxlength="5" placeholder="This defines the prefix for the status and module queries.">
</div>
<div class="form-group">
<label for="inputRealname" class="col-sm-2 control-label"><? FORMAT "Realname:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputRealname" name="realname" value="<? VAR RealName ?>" maxlength="256" placeholder="<? FORMAT "Your real name." ?>">
<input type="text" class="form-control" id="inputRealname" name="realname" value="<? VAR RealName ?>" maxlength="256" placeholder="The real name of the user.">
</div>
</div>
<? IF BindHostEdit ?>
<div class="form-group">
<label for="inputBindHost" class="col-sm-2 control-label"><? FORMAT "BindHost:" ?></label>
<input type="text" class="form-control" id="inputQuit" name="quitmsg" value="<? VAR QuitMsg ?>" maxlength="256" placeholder="<? FORMAT "You may define a Message shown, when you quit IRC." ?>">
<input type="text" class="form-control" id="inputQuit" name="quitmsg" value="<? VAR QuitMsg ?>" maxlength="256" placeholder="You may define a Message shown, when you quit IRC.">
<td><a href="<? VAR ModPath TOP ?>addnetwork?user=<? VAR Username ESC=URL ?>" class="btn btn-default btn-xs"><? FORMAT "Add" ?></a></td>
<td><a href="addnetwork?user=<? VAR Username ESC=URL ?>" class="btn btn-default btn-xs">Add</a></td>
<? IF NetworkLoop ?>
<td><? FORMAT "Name" ?></td>
<td><? FORMAT "Clients" ?></td>
<td><? FORMAT "Current Server" ?></td>
<td><? FORMAT "Nick" ?></td>
<td>Name</td>
<td>Clients</td>
<td>Current Server</td>
<td>IRC Nick</td>
<? ELSE ?>
<td><? FORMAT "← Add a network (opens in same page)" ?></td>
<td><- Add a network (opens in same page)</td>
<? ENDIF ?>
</tr>
</thead>
@ -187,7 +176,7 @@
<tr>
<td>
<input type="hidden" name="network" value="<? VAR Name ?>" />
<a href="<? VAR ModPath TOP ?>editnetwork?user=<? VAR Username ESC=URL ?>&network=<? VAR Name ESC=URL ?>" class="btn btn-primary btn-xs">Edit</a> <a href="delnetwork?user=<? VAR Username ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-danger btn-xs"><? FORMAT "Del" ?></a>
<a href="editnetwork?user=<? VAR Username ESC=URL ?>&network=<? VAR Name ESC=URL ?>" class="btn btn-primary btn-xs">Edit</a> <a href="delnetwork?user=<? VAR Username ESC=URL ?>&name=<? VAR Name ESC=URL ?>" class="btn btn-danger btn-xs">Delete</a>
</td>
<td><? VAR Name ?></td>
<td><? VAR Clients ?></td>
@ -198,35 +187,21 @@
</tbody>
</table>
<? ELSE ?>
<? IF Clone ?>
<span class="info"><? FORMAT "You will be able to add + modify networks here after you have cloned the user." ?></span><br />
<? ELSE ?>
<span class="info"><? FORMAT "You will be able to add + modify networks here after you have created the user." ?></span><br />
<? ENDIF ?>
<span class="info">You will be able to add + modify networks here after you <? IF Clone ?>have cloned<? ELSE ?>created<? ENDIF ?> the user.</span><br />
<? ENDIF ?>
</div><!-- Networks -->
<!-- Modules -->
<div class="tab-pane fade" id="modulestab">
<? LOOP EmbeddedModuleLoop ?>
<? IF Embed ?>
<div class="form-group">
<label for="input<? VAR ModName ?>" class="col-sm-2 control-label"><? VAR ModName ?>:</label>
<input type="checkbox" name="loadmod" id="lm_<? VAR Name ?>" value="<? VAR Name ?>" class="cmn-toggle cmn-toggle-round-flat" value="<? VAR Name ?>"<? IF Checked ?> checked="checked"<? ENDIF ?><? IF Disabled ?> disabled="disabled"<? ENDIF ?> />
<? IF Disabled ?>
<input type="hidden" name="loadmod" value="<? VAR Name ?>" value="<? VAR Name ?>"<? IF Checked ?> checked="checked"<? ENDIF ?> />
<input type="text" class="form-control" id="inputModes" name="chanmodes" value="<? VAR DefaultChanModes ?>" maxlength="32" placeholder="<? FORMAT "These are the default modes ZNC will set when you join an empty channel." ?>">
<div class="alert alert-info help-block"><? FORMAT "Empty = use standard value" ?></div>
<input type="text" class="form-control" id="inputModes" name="chanmodes" value="<? VAR DefaultChanModes ?>" maxlength="32" placeholder="These are the default modes ZNC will set when you join an empty channel.">
<div class="alert alert-info help-block">Empty = use standard value</div>
</div>
</div>
<div class="form-group">
<label for="chanbuffersize" class="col-sm-2 control-label"><? FORMAT "Buffer Size:" ?></label>
<input type="text" class="form-control" id="chanbufsize" name="chanbufsize" value="<? VAR ChanBufferSize ?>" min="0" placeholder="<? FORMAT "This is the amount of lines that the playback buffer will store for channels before dropping off the oldest line. The buffers are stored in the memory by default." ?>" />
<div class="alert alert-info help-block"><? FORMAT "Empty = use standard value" ?></div>
<input type="text" class="form-control" id="inputBufferSize" name="bufsize" value="<? VAR BufferCount ?>" min="0" placeholder="This is the amount of lines that the playback buffer will store before dropping off the oldest line. The buffers are stored in the memory by default." />
<div class="alert alert-info help-block">Empty = use standard value</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="queriestab">
<div class="form-group">
<label for="maxquerybuffers" class="col-sm-2 control-label"><? FORMAT "Max Buffers:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="maxquerybuffers" name="maxquerybuffers" value="<? VAR MaxQueryBuffers ?>" min="0" placeholder="<? FORMAT "Maximum number of query buffers. 0 is unlimited." ?>" />
<div class="alert alert-info help-block"><? FORMAT "Empty = use standard value" ?></div>
</div>
</div>
<div class="form-group">
<label for="querybufsize" class="col-sm-2 control-label"><? FORMAT "Buffer Size:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="querybufsize" name="querybufsize" value="<? VAR QueryBufferSize ?>" min="0" placeholder="<? FORMAT "This is the amount of lines that the playback buffer will store for queries before dropping off the oldest line. The buffers are stored in the memory by default." ?>" />
<div class="alert alert-info help-block"><? FORMAT "Empty = use standard value" ?></div>
<div class="alert alert-info help-block"><? FORMAT "Any of the following text boxes can be left empty to use their default value." ?></div>
<div class="form-group">
<label for="inputtimeFormat" class="col-sm-2 control-label"><? FORMAT "Timestamp Format:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputtimeFormat" name="timestampformat" value="<? VAR TimestampFormat ?>" placeholder="The format for the timestamps used in buffers, for example [%H:%M:%S]." />
<div class="alert alert-info help-block"><? FORMAT "The format for the timestamps used in buffers, for example [%H:%M:%S]. This setting is ignored in new IRC clients, which use server-time. If your client supports server-time, change timestamp format in client settings instead." ?></div>
</div>
<div class="alert alert-info help-block">Any of the following text boxes can be left empty to use their default value.</div>
<input type="text" class="form-control" id="inputtimeFormat" name="timestampformat" value="<? VAR TimestampFormat ?>" placeholder="The format for the timestamps used in buffers, for example [%H:%M:%S]." />
<div class="alert alert-info help-block">This setting is ignored in new IRC clients, which use server-time. If your client supports server-time, change timestamp format in client settings instead.</div>
</div>
<div class="form-group">
<label for="inputTimezone" class="col-sm-2 control-label"><? FORMAT "Timezone:" ?></label>
<div class="col-sm-10">
<input class="form-control" id="inputTimezone" name="timezone" value="<? VAR Timezone ?>" placeholder="<? FORMAT "Select your timezone." ?>">
<div class="alert alert-info help-block"><? FORMAT "E.g. <code>Europe/Berlin</code>, or <code>GMT-6</code>" ?></div>
<span class="help-block">Character encoding used between IRC client and ZNC. After changing this, reconnect client to ZNC</span>
</div>
<div class="form-group">
<label for="inputJoinTries" class="col-sm-2 control-label"><? FORMAT "Join Tries:" ?></label>
<div class="col-sm-10">
<input class="form-control" type="number" id="inputJoinTries" name="jointries" value="<? VAR JoinTries ?>" min="0" placeholder="<? FORMAT "This defines how many times ZNC tries to join a channel, if the first join failed, e.g. due to channel mode +i/+k or if you are banned." ?>" />
<input class="form-control" type="number" id="inputJoinTries" name="jointries" value="<? VAR JoinTries ?>" min="0" placeholder="This defines how often ZNC tries to join, if the first join failed, e.g. due to channel mode +i/+k or if you're banned."/>
</div>
<div class="form-group">
<label for="inputMaxJoins" class="col-sm-2 control-label"><? FORMAT "Join speed:" ?></label>
<div class="col-sm-10">
<input class="form-control" type="number" id="inputMaxJoins" name="maxjoins" value="<? VAR MaxJoins ?>" min="0" placeholder="<? FORMAT "How many channels are joined in one JOIN command. 0 is unlimited (default). Set to small positive value if you get disconnected with “Max SendQ Exceeded”" ?>" />
<input class="form-control" type="number" id="inputMaxJoins" name="maxjoins" value="<? VAR MaxJoins ?>" min="0" placeholder="How many channels are joined in one JOIN command. 0 is unlimited (default). Set to small positive value if you get disconnected with `Max SendQ Exceeded'"/>
</div>
<div class="form-group">
<label for="inputmaxIRCnet" class="col-sm-2 control-label"><? FORMAT "Max IRC Networks Number:" ?></label>
<div class="col-sm-10">
<input class="form-control" type="number" id="inputmaxIRCnet" name="maxnetworks" value="<? VAR MaxNetworks ?>" min="0" placeholder="<? FORMAT "Maximum number of IRC networks allowed for this user." ?>" <? IF !ImAdmin ?>disabled="disabled"<? ENDIF ?> />
<input class="form-control" type="number" id="inputmaxIRCnet" name="maxnetworks" value="<? VAR MaxNetworks ?>" min="0" placeholder="Maximum number of IRC networks allowed for this user." <? IF !ImAdmin ?>disabled="disabled"<? ENDIF ?> />
</div>
<div class="form-group">
<label for="notraffictimeout" class="col-sm-2 control-label"><? FORMAT "Timeout before reconnect:" ?></label>
<div class="col-sm-10">
<input class="form-control" type="number" id="notraffictimeout" name="notraffictimeout" value="<? VAR NoTrafficTimeout ?>" class="third" min="30" placeholder="<? FORMAT "How much time ZNC waits (in seconds) until it receives something from network or declares the connection timeout. This happens after attempts to ping the peer." ?>"/>
<input class="form-control" type="number" id="inputmaxQueryBuffers" name="maxquerybuffers" value="<? VAR MaxQueryBuffers ?>" class="third" min="0" placeholder="Maximum number of query buffers. 0 is unlimited."/>
<div class="alert alert-info help-block"><? FORMAT "One reply per line. Example: <code>TIME Buy a watch!</code>" ?></div>
<div class="alert alert-info help-block"><? FORMAT "{1} are available" "Substitutions_Link ESC=" ?></div>
<div class="alert alert-info help-block">One reply per line. Example: TIME Buy a watch!</div>
</div>
</div>
<div class="form-group" id="ctcpreplies_js" style="display:none" data-placeholder="<? FORMAT "Empty value means this CTCP request will be ignored" ?>">
<label for="ctcpreplies" class="col-sm-2 control-label"><? FORMAT "CTCP Replies:" ?></label>
<label for="inputSkins" class="col-sm-2 control-label"><? FORMAT "Skin:" ?></label>
<div class="col-sm-10">
<? IF SkinLoop ROWS > 1 ?>
<select class="form-control" name="skin">
<option value=""><? FORMAT "- Global -" ?></option>
<? LOOP SkinLoop ?>
<option value="<? VAR Name ?>"<? IF Checked ?> selected="selected"<? ENDIF ?>><? IF Name == "_default_" ?><? FORMAT "Default" ?><? ELSE ?><? VAR Name ?><? ENDIF ?></option>
<div class="alert alert-info help-block">One reply per line. Example: TIME Buy a watch! — Some variable-like strings can be found <a href="http://wiki.znc.in/ExpandString" target="_blank">here</a></div>
</div>
<div class="form-group">
<label for="language" class="col-sm-2 control-label"><? FORMAT "Language:" ?></label>
<div class="col-sm-10">
<? IF HaveI18N ?>
<select class="form-control" name="language">
<? LOOP LanguageLoop ?>
<option value="<? VAR Code ?>" <? IF Language TOP == *Code ?>selected="selected"<? ENDIF ?>><? VAR Name ?></option>
<option value="<? VAR Name ?>"<? IF Checked ?> selected="selected"<? ENDIF ?>><? IF Name == "_default_" ?>Default<? ELSE ?><? VAR Name ?><? ENDIF ?></option>
<? ENDLOOP ?>
</select>
<? ELSE ?>
<p>No other skins found!</p>
<? ENDIF ?>
</div>
</div>
</div><!-- ZNC Behavior -->
<!-- Other Modules -->
<div class="tab-pane fade" id="othermodtab">
<? LOOP EmbeddedModuleLoop ?>
<? IF Embed ?>
<div class="form-group">
<label for="input<? VAR ModName ?>" class="col-sm-2 control-label"><? VAR ModName ?>:</label>
<input class="btn btn-success" type="submit" name="submit_return" value="<? IF Edit ?><? FORMAT "Save and return" ?><? ELSE ?><? IF Clone ?><? FORMAT "Clone and return" ?><? ELSE ?><? FORMAT "Create and return" ?><? ENDIF ?><? ENDIF ?>" />
<input class="btn btn-default" type="submit" name="submit_continue" value="<? IF Edit ?><? FORMAT "Save and continue" ?><? ELSE ?><? IF Clone ?><? FORMAT "Clone and continue" ?><? ELSE ?><? FORMAT "Create and continue" ?><? ENDIF ?><? ENDIF ?>" />
<input type="radio" name="encoding_utf" id="encoding_utf_legacy" value="legacy" <? IF EncodingUtf == "legacy" ?>checked="checked"<? ENDIF ?> <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<span class="help-block" for="encoding_utf_legacy"><? FORMAT "Don't ensure any encoding at all (legacy mode, not recommended)" ?></span>
<span class="help-block" for="encoding_utf_legacy">Don't ensure any encoding at all (legacy mode, not recommended)</span>
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="encoding_utf" id="encoding_utf_send" value="send" <? IF EncodingUtf == "send" ?>checked="checked"<? ENDIF ?> <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<span class="help-block" for="encoding_utf_send"><? FORMAT "Try to parse as UTF-8 and as {1}, send as UTF-8 (recommended)" "Encoding_Placeholder ESC=" ?></span>
<span class="help-block" for="encoding_utf_send">Try to parse as UTF-8 and as <span class="encoding-placeholder-big text-success"> <span class="encoding-placeholder"></span> </span>, send as UTF-8</span>
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="encoding_utf" id="encoding_utf_receive" value="receive" <? IF EncodingUtf == "receive" ?>checked="checked"<? ENDIF ?> <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<span class="help-block" for="encoding_utf_receive"><? FORMAT "Try to parse as UTF-8 and as {1}, send as {1}" "Encoding_Placeholder ESC=" ?></span>
<span class="help-block" for="encoding_utf_receive">Try to parse as UTF-8 and as <span class="encoding-placeholder-big text-success"> <span class="encoding-placeholder"></span> </span>, send as <span class="encoding-placeholder-big text-success"> <span class="encoding-placeholder"></span > </span>
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="encoding_utf" id="encoding_utf_simple" value="simple" <? IF EncodingUtf == "simple" ?>checked="checked"<? ENDIF ?> <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<span class="help-block" for="encoding_utf_simple"><? FORMAT "Parse and send as {1} only" "Encoding_Placeholder ESC=" ?></span>
<span class="help-block" for="encoding_utf_simple">Parse and send as <span class="encoding-placeholder-big text-success"> <span class="encoding-placeholder"></span> </span> only</span>
</label>
</div>
<div class="test-text">
<input class="form-control" type="text" name="encoding" placeholder="<? FORMAT "E.g. <code>UTF-8</code>, or <code>ISO-8859-15</code>" ?>" value="<? VAR Encoding ?>" list="encoding_list" <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<input class="form-control" type="text" name="encoding" placeholder="Enter a text here (e.g. UTF-8 or ISO-8859-15)" value="<? VAR Encoding ?>" list="encoding_list" <? IF EncodingDisabled ?>disabled="disabled"<? ENDIF ?> />
<p><? FORMAT "Welcome to the ZNC webadmin module." ?><br><? FORMAT "All changes you make will be in effect immediately after you submitted them." ?></p>
<p>Welcome to the ZNC webadmin module.<br>All changes you make will be in effect immediately after you submitted them.</p>
<a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>edituser?user=<?VAR Username ESC=URL?>" class="btn btn-primary btn-xs"><? FORMAT "Edit" ?></a>
<a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>adduser?clone=<? VAR Username ESC=URL ?>" alt="Clone <? VAR Username ESC=URL ?>" class="btn btn-warning btn-xs"><? FORMAT "Clone" ?></a>
<? IF !IsSelf ?><a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>deluser?user=<?VAR Username ESC=URL?>" class="btn btn-danger btn-xs"><? FORMAT "Delete" ?></a><? ENDIF ?>
<a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>edituser?user=<?VAR Username ESC=URL?>" class="btn btn-primary btn-xs">Edit</a>
<a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>adduser?clone=<? VAR Username ESC=URL ?>" alt="Clone <? VAR Username ESC=URL ?>" class="btn btn-warning btn-xs">Clone</a>
<? IF !IsSelf ?><a href="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>deluser?user=<?VAR Username ESC=URL?>" class="btn btn-danger btn-xs">Delete</a><? ENDIF ?>
</span>
</td>
<td><? VAR Username ?></td>
<td><? VAR Networks ?></td>
<td><? VAR Clients ?></td>
</tr>
<?ENDLOOP?>
</tbody>
</table>
<?ENDIF?>
</div>
</div>
</div>
<script>
function UserSearch() {
var input, filter, table, tr, td, i;
input = document.getElementById("inputSearch");
filter = input.value.toUpperCase();
table = document.getElementById("users");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[1];
if (td) {
if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
<input name="unavailable" type="text" disabled="disabled" title="<? FORMAT "To delete port which you use to access webadmin itself, either connect to webadmin via another port, or do it in IRC (/znc DelPort)" ?>" value="<? FORMAT "Current" ?>" />
<option value="<? VAR Name ?>"<? IF Checked ?> selected="selected"<? ENDIF ?>><? IF Name == "_default_" ?><? FORMAT "Default" ?><? ELSE ?><? VAR Name ?><? ENDIF ?></option>
<option value="<? VAR Name ?>"<? IF Checked ?> selected="selected"<? ENDIF ?>><? IF Name == "_default_" ?>Default<? ELSE ?><? VAR Name ?><? ENDIF ?></option>
<? ENDLOOP ?>
</select>
</div>
</div>
<div class="form-group">
<label for="inputStatusPrefix" class="col-sm-2 control-label"><? FORMAT "Status Prefix:" ?></label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputStatusPrefix" value="<? VAR StatusPrefix ?>" placeholder="<? FORMAT "The prefix for the status and module queries." ?>"/>
<div class="alert alert-info help-block"><? FORMAT "Default for new users only." ?></div>
<input type="text" class="form-control" id="inputStatusPrefix" value="<? VAR StatusPrefix ?>" placeholder="The prefix for the status and module queries."/>
<div class="alert alert-info help-block">Default for new users only.</div>
</div>
<div class="form-group">
<label for="inputmaxBufferSize" class="col-sm-2 control-label"><? FORMAT "Maximum Buffer Size:" ?></label>
<div class="col-sm-10">
<input type="number" class="form-control" id="inputmaxBufferSize" name="maxbufsize" value="<? VAR MaxBufferSize ?>" placeholder="<? FORMAT "Sets the global Max Buffer Size a user can have." ?>"/>
<input type="number" class="form-control" id="inputmaxBufferSize" name="maxbufsize" value="<? VAR MaxBufferSize ?>" placeholder="Sets the global Max Buffer Size a user can have."/>
</div>
<div class="form-group">
<label for="inputConnectDelay" class="col-sm-2 control-label"><? FORMAT "Connect Delay:" ?></label>
<div class="col-sm-10">
<input type="number" class="form-control" id="inputConnectDelay" name="connectdelay" value="<? VAR ConnectDelay ?>" placeholder="<? FORMAT "The time between connection attempts to IRC servers, in seconds. This affects the connection between ZNC and the IRC server; not the connection between your IRC client and ZNC." ?>" />
<input type="number" class="form-control" id="inputConnectDelay" name="connectdelay" value="<? VAR ConnectDelay ?>" placeholder="The time every connection will be delayed, in seconds. Some servers refuse your connection if you reconnect too fast. This affects the connection between ZNC and the IRC server; not the connection between your IRC client and ZNC. "/>
</div>
<div class="form-group">
<label for="inputServerThrottle" class="col-sm-2 control-label"><? FORMAT "Server Throttle:" ?></label>
<div class="col-sm-10">
<input type="number" class="form-control" id="inputServerThrottle" name="serverthrottle" value="<? VAR ServerThrottle ?>" placeholder="<? FORMAT "The minimal time between two connect attempts to the same hostname, in seconds. Some servers refuse your connection if you reconnect too fast." ?>" />
<input type="number" class="form-control" id="inputServerThrottle" name="serverthrottle" value="<? VAR ServerThrottle ?>" placeholder="The time between two connect attempts to the same hostname." />
</div>
<div class="form-group">
<label for="inputAnonIPLimit" class="col-sm-2 control-label"><? FORMAT "Anonymous Connection Limit per IP:" ?></label>
<div class="col-sm-10">
<input type="number" class="form-control" id="inputAnonIPLimit" name="anoniplimit" value="<? VAR AnonIPLimit ?>" placeholder="<? FORMAT "Limits the number of unidentified connections per IP." ?>" />
</div>
</div>
<div class="form-group">
<label for="inputAnonIPLimit" class="col-sm-2 control-label">Anonymous IP Limit:</label>
<div class="col-sm-10">
<input type="number" class="form-control" id="inputAnonIPLimit" name="anoniplimit" value="<? VAR AnonIPLimit ?>" placeholder="Limits the number of unidentified connections per IP." />
</div>
<div class="form-group">
<label for="inputprotectWeb" class="col-sm-2 control-label"><? FORMAT "Protect Web Sessions:" ?></label>
<p>Welcome to ZNC's web interface! — This web interface will allow you to manage your ZNC account(s) via the WWW. You will be able to enable, disable, add, edit, remove, clone, search your bouncer(s).</p>
<p>New to ZNC? Trying to figure out how to connect to your ZNC? Check out the official <a href="http://wiki.znc.in/" target="_blank">ZNC Wiki</a> or hop onto the IRC channel: #zncatLibera.Chat.</p>
<p>New to ZNC? Trying to figure out how to connect to your ZNC? Check out the official <a href="http://wiki.znc.in/" target="_blank">ZNC Wiki</a> or hop onto the IRC channel: #zncatFreenode orEFnetIRCNetwork.</p>
<?IF !GlobalModLoop ?>
<?IF !UserModLoop ?>
<p>Oppss! No Web-enabled modules have been loaded. Load modules from IRC ("<code>/msg *status help</code>" and "<code>/msg *status loadmod <module></code>"). Once you have loaded some Web-enabled modules, the menu will expand.</p>