Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
175 lines (165 loc) · 10.3 KB
/
Copy pathindex.html
File metadata and controls
175 lines (165 loc) · 10.3 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<!DOCTYPE>
<html lang="html">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Tac Net discord bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IM+Fell+English:ital@0;1&family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&family=Special+Elite&display=swap">
<link rel="stylesheet" href="styles.css">
<link rel="shortcut icon" href="favicon.png" type="image/x-icon">
</head>
<body>
<div class="video-modal">
<div class="topbar">
<iconify-icon icon="line-md:youtube"></iconify-icon>
<span>Demonstration Video</span>
<button id="modal-close" type="button" class="close-button">
<iconify-icon icon="line-md:close"></iconify-icon>
</button>
</div>
<iframe src="https://www.youtube.com/embed/r6Z_AebLlI8?si=mhyJh1TXAphK32xv" title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>
</iframe>
</div>
<div class="content">
<header class="page-title">
<img src="favicon.png" alt="Tac Net icon">
<h1>Tac Net Discord Bot</h1>
<button id="invites-open" type="button" class="invites-toggle" aria-controls="invites-panel" aria-expanded="false">
<iconify-icon icon="line-md:plus-circle"></iconify-icon>
Bot invites
</button>
</header>
<div class="content-body">
<div>
<h2><iconify-icon icon="line-md:question-circle"></iconify-icon>What is it</h2>
<p>
A Discord bot that turns a set of voice channels, in the same server or across different
servers, into a half-duplex "radio net". Coordinate between groups of people in different locations, or just have fun with friends.
The bot can be added to any server, and the voice channels can be in any server, as long as the bot has permission to join them.
</p>
</div>
<div>
<h2>
<iconify-icon icon="line-md:discord"></iconify-icon>
<span>How it works</span>
<button type="button" id="modal-open" class="demo-video-button">
<iconify-icon icon="line-md:youtube"></iconify-icon>
Video
</button>
</h2>
<p>
The user starts a radio net by running the <span class="highlight">/net host</span> command while in a voice channel. This creates a new net and a
unique join code. The other users can then join the net by running <span class="highlight">/net join <join code></span> command.
Do this for each channel that should be in the net. Running these commands will make the bots join the voice channels and start
listening for a priority speaker. When it detects a priority speaker in one channel, it transmits that audio to all other channels
on the same net.
</p>
</div>
<div>
<h2><iconify-icon icon="line-md:cog"></iconify-icon>Setting up</h2>
<ul>
<li>Invite the <span class="highlight">Coordinator Bot</span> and an optional amount of relay bots to your server.</li>
<li>Assign a role with <span class="highlight">Priority Speaker</span> permissions to users.</li>
<li>Set up a Discord hotkey for <span class="highlight">Voice Activity Priority</span> to act as the radio PTT.</li>
</ul>
</div>
<div>
<h2><iconify-icon inline icon="line-md:document-code"></iconify-icon>Commands</h2>
<ul>
<li><span class="highlight">/net host</span> - Hosts a new radio net and creates a unique join code.</li>
<li><span class="highlight">/net join <join code></span> - Joins a existing radio net using the unique code created with <span class="highlight">/net host</span></li>
<li><span class="highlight">/net leave</span> - Leave the radio net. Can not be used by the hoster.</li>
<li><span class="highlight">/net end</span> - Ends the radio network and kicks all other participants. Must be used by the hoster.</li>
<li><span class="highlight">/net status</span> - List linked channels and who is currently transmitting.</li>
<li><span class="highlight">/net preferences</span> - Set user preferences like microphone gain.</li>
</ul>
</div>
</div>
</div>
<aside class="invites" id="invites-panel" aria-label="Bot invites">
<div class="invites-heading">
<h1><iconify-icon inline icon="line-md:discord"></iconify-icon>Bot invites</h1>
<button id="invites-close" type="button" class="invites-close" aria-label="Close bot invites">
<iconify-icon icon="line-md:close"></iconify-icon>
</button>
</div>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533606850900000869&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_net_pfp.png" alt="Radio Net">
<div>
<h3>Coordinator <span class="bot-hint required">REQUIRED</span></h3>
<span>Runs /net commands and doubles as a relay</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533607051224158349&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_relay_pfp.png" alt="Radio Net">
<div>
<h3>Relay Alpha <span class="bot-hint optional">OPTIONAL</span></h3>
<span>Adds one extra same-server channel capacity</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533607123018055841&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_relay_pfp.png" alt="Radio Net">
<div>
<h3>Relay Bravo <span class="bot-hint optional">OPTIONAL</span></h3>
<span>Adds one extra same-server channel capacity</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533607192299831376&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_relay_pfp.png" alt="Radio Net">
<div>
<h3>Relay Charlie <span class="bot-hint optional">OPTIONAL</span></h3>
<span>Adds one extra same-server channel capacity</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533609282736492574&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_relay_pfp.png" alt="Radio Net">
<div>
<h3>Relay Delta <span class="bot-hint optional">OPTIONAL</span></h3>
<span>Adds one extra same-server channel capacity</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
<a class="invite-card" target="_blank" href="https://discord.com/oauth2/authorize?client_id=1533917410728611929&permissions=3146752&integration_type=0&scope=bot+applications.commands">
<img src="radio_relay_pfp.png" alt="Radio Net">
<div>
<h3>Relay Echo <span class="bot-hint optional">OPTIONAL</span></h3>
<span>Adds one extra same-server channel capacity</span>
</div>
<iconify-icon icon="line-md:external-link"></iconify-icon>
</a>
</aside>
</body>
<script src="https://code.iconify.design/iconify-icon/3.0.0/iconify-icon.min.js"></script>
<script>
const modal = document.querySelector('.video-modal');
const openModalButton = document.getElementById('modal-open');
const closeModalButton = document.getElementById('modal-close');
const invitesPanel = document.getElementById('invites-panel');
const openInvitesButton = document.getElementById('invites-open');
const closeInvitesButton = document.getElementById('invites-close');
const setInvitesOpen = (isOpen) => {
invitesPanel.classList.toggle('active', isOpen);
openInvitesButton.setAttribute('aria-expanded', String(isOpen));
};
openModalButton.addEventListener('click', () => {
modal.classList.add('active');
});
closeModalButton.addEventListener('click', () => {
modal.classList.remove('active');
});
openInvitesButton.addEventListener('click', () => setInvitesOpen(true));
closeInvitesButton.addEventListener('click', () => setInvitesOpen(false));
window.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
modal.classList.remove('active');
setInvitesOpen(false);
}
});
</script>
</html>