mirror of https://github.com/icedream/ts3bot.git
Remove the HTTP API server and do everything directly.
parent
6d49bdfdaa
commit
7890e22723
94
app.iced
94
app.iced
|
@ -8,6 +8,8 @@ request = require "request"
|
||||||
fs = require("fs")
|
fs = require("fs")
|
||||||
path = require("path")
|
path = require("path")
|
||||||
qs = require "querystring"
|
qs = require "querystring"
|
||||||
|
youtubedl = require "youtube-dl"
|
||||||
|
isValidUrl = (require "valid-url").isWebUri
|
||||||
|
|
||||||
log = getLogger "Main"
|
log = getLogger "Main"
|
||||||
|
|
||||||
|
@ -44,6 +46,14 @@ await services.find("pulseaudio").start defer err
|
||||||
if err
|
if err
|
||||||
log.warn "PulseAudio could not start up, audio may not act as expected!"
|
log.warn "PulseAudio could not start up, audio may not act as expected!"
|
||||||
|
|
||||||
|
# VLC HTTP API
|
||||||
|
await services.find("vlc").start defer err
|
||||||
|
if err
|
||||||
|
log.warn "VLC could not start up!"
|
||||||
|
await module.exports.shutdown defer()
|
||||||
|
process.exit 1
|
||||||
|
vlc = services.find("vlc").instance
|
||||||
|
|
||||||
# TeamSpeak3
|
# TeamSpeak3
|
||||||
ts3clientService = services.find("ts3client")
|
ts3clientService = services.find("ts3client")
|
||||||
|
|
||||||
|
@ -135,39 +145,58 @@ ts3clientService.on "started", (ts3proc) =>
|
||||||
|
|
||||||
switch name.toLowerCase()
|
switch name.toLowerCase()
|
||||||
when "play"
|
when "play"
|
||||||
q =
|
inputBB = paramline
|
||||||
uid: invoker.uid
|
input = removeBB paramline
|
||||||
input: removeBB paramline
|
|
||||||
await request "http://127.0.0.1:16444/play?#{qs.stringify q}", defer(err, response)
|
# only allow playback from file if it's a preconfigured alias
|
||||||
switch response.statusCode
|
if isValidUrl input
|
||||||
when 200 then ts3query.sendtextmessage args.targetmode, invoker.id, "Now playing #{paramline}."
|
log.debug "Got input URL:", input
|
||||||
when 400 then ts3query.sendtextmessage args.targetmode, invoker.id, "Something seems to be wrong with what you wrote. Maybe check the URL/sound name you provided?"
|
|
||||||
when 403 then ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, you're not allowed to play #{q.input} via the bot."
|
|
||||||
else
|
else
|
||||||
log.warn "API reported error", response.statusCode, err
|
input = config.get "aliases:#{input}"
|
||||||
|
if not(isValidUrl input) and not(fs.existsSync input)
|
||||||
|
log.debug "Got neither valid URL nor valid alias:", input
|
||||||
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, you're not allowed to play #{inputBB} via the bot."
|
||||||
|
return
|
||||||
|
|
||||||
|
# TODO: permission system to check if uid is allowed to play this url or alias
|
||||||
|
|
||||||
|
await vlc.status.empty defer(err)
|
||||||
|
if err
|
||||||
|
log.warn "Couldn't empty VLC playlist", err
|
||||||
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, an error occurred. Try again later."
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, an error occurred. Try again later."
|
||||||
|
return
|
||||||
|
|
||||||
|
# let's give youtube-dl a shot!
|
||||||
|
await youtubedl.getInfo input, [
|
||||||
|
"--format=bestaudio"
|
||||||
|
], defer(err, info)
|
||||||
|
if err or not info?
|
||||||
|
log.debug "There is no audio-only download for #{inputBB}, downloading full video instead."
|
||||||
|
await youtubedl.getInfo input, [
|
||||||
|
"--format=best"
|
||||||
|
], defer(err, info)
|
||||||
|
if err or not info?
|
||||||
|
info =
|
||||||
|
url: input
|
||||||
|
if not info.url?
|
||||||
|
info.url = input
|
||||||
|
info.title = input # URL as title
|
||||||
|
|
||||||
|
await vlc.status.play info.url, defer(err)
|
||||||
|
if err
|
||||||
|
vlc.status.empty()
|
||||||
|
log.warn "VLC API returned an error when trying to play", err
|
||||||
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Something seems to be wrong with that media. Maybe check the URL/sound name you provided?"
|
||||||
|
return
|
||||||
|
|
||||||
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Now playing [URL=#{input}]#{info.title}[/URL]."
|
||||||
when "stop"
|
when "stop"
|
||||||
q =
|
vlc.status.stop()
|
||||||
uid: invoker.uid
|
vlc.status.empty()
|
||||||
await request "http://127.0.0.1:16444/stop?#{qs.stringify q}", defer(err, response)
|
|
||||||
switch response.statusCode
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Stopped playback."
|
||||||
when 200 then ts3query.sendtextmessage args.targetmode, invoker.id, "Stopped playback."
|
|
||||||
when 403 then ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, you're not allowed to do that."
|
|
||||||
else
|
|
||||||
log.warn "API reported error", response.statusCode, err
|
|
||||||
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, an error occurred. Try again later."
|
|
||||||
when "setvolume"
|
when "setvolume"
|
||||||
q =
|
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, that's not implemented yet."
|
||||||
uid: invoker.uid
|
|
||||||
volume: parseFloat paramline
|
|
||||||
await request "http://127.0.0.1:16444/setvolume?#{qs.stringify q}", defer(err, response)
|
|
||||||
switch response.statusCode
|
|
||||||
when 200 then ts3query.sendtextmessage args.targetmode, invoker.id, "Set volume to #{q.volume}"
|
|
||||||
when 400 then ts3query.sendtextmessage args.targetmode, invoker.id, "Something seems to be wrong with what you wrote. Maybe check the volume? It's supposed to be a floating-point number between 0 and 2."
|
|
||||||
when 403 then ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, you're not allowed to do that."
|
|
||||||
else
|
|
||||||
log.warn "API reported error", response.statusCode, err
|
|
||||||
ts3query.sendtextmessage args.targetmode, invoker.id, "Sorry, an error occurred. Try again later."
|
|
||||||
when "changenick"
|
when "changenick"
|
||||||
nick = if paramline.length > params[0].length then paramline else params[0]
|
nick = if paramline.length > params[0].length then paramline else params[0]
|
||||||
if nick.length < 1 or nick.length > 32
|
if nick.length < 1 or nick.length > 32
|
||||||
|
@ -185,10 +214,3 @@ if err
|
||||||
log.error "TeamSpeak3 could not start, shutting down."
|
log.error "TeamSpeak3 could not start, shutting down."
|
||||||
await module.exports.shutdown defer()
|
await module.exports.shutdown defer()
|
||||||
process.exit 1
|
process.exit 1
|
||||||
|
|
||||||
# HTTP API
|
|
||||||
await services.find("api").start defer err
|
|
||||||
if err
|
|
||||||
log.error "API could not start up, shutting down!"
|
|
||||||
await module.exports.shutdown defer()
|
|
||||||
process.exit 1
|
|
|
@ -56,7 +56,6 @@ module.exports.Service = require "./service_template"
|
||||||
|
|
||||||
# register services
|
# register services
|
||||||
services = [
|
services = [
|
||||||
new(require "./services/api")
|
|
||||||
new(require "./services/pulseaudio")
|
new(require "./services/pulseaudio")
|
||||||
new(require "./services/ts3client")
|
new(require "./services/ts3client")
|
||||||
new(require "./services/vlc")
|
new(require "./services/vlc")
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
express = require "express"
|
|
||||||
url = require "url"
|
|
||||||
path = require "path"
|
|
||||||
spawn = require("child_process").spawn
|
|
||||||
net = require "net"
|
|
||||||
Socket = net.Socket
|
|
||||||
getLogger = require "../logger"
|
|
||||||
config = require "../config"
|
|
||||||
log = getLogger "API"
|
|
||||||
youtubedl = require "youtube-dl"
|
|
||||||
#PulseAudio = require "pulseaudio"
|
|
||||||
isValidUrl = (require "valid-url").isWebUri
|
|
||||||
|
|
||||||
services = require "../services"
|
|
||||||
|
|
||||||
module.exports = class APIService extends services.Service
|
|
||||||
dependencies: [
|
|
||||||
"pulseaudio"
|
|
||||||
"vlc"
|
|
||||||
"ts3client"
|
|
||||||
]
|
|
||||||
constructor: () -> super "API",
|
|
||||||
start: (cb) ->
|
|
||||||
if @httpServer
|
|
||||||
cb? null
|
|
||||||
return
|
|
||||||
|
|
||||||
vlc = services.find("vlc").instance
|
|
||||||
ts3query = services.find("ts3client").query
|
|
||||||
|
|
||||||
# set up HTTP server
|
|
||||||
log.debug "Starting up HTTP API..."
|
|
||||||
app = express()
|
|
||||||
app.get "/play", (req, res) =>
|
|
||||||
if not req.query.uid
|
|
||||||
log.debug "Didn't get a UID, sending forbidden"
|
|
||||||
res.status(400).send("Forbidden")
|
|
||||||
return
|
|
||||||
if not req.query.input
|
|
||||||
log.debug "Didn't get an input URI/alias, sending bad request"
|
|
||||||
res.status(400).send("Bad request")
|
|
||||||
return
|
|
||||||
|
|
||||||
input = null
|
|
||||||
# only allow playback from file if it's a preconfigured alias
|
|
||||||
if isValidUrl req.query.input
|
|
||||||
log.debug "Got input URL:", req.query.input
|
|
||||||
input = req.query.input
|
|
||||||
else
|
|
||||||
input = config.get("aliases:#{req.query.input}")
|
|
||||||
if not(isValidUrl input) and not(fs.existsSync input)
|
|
||||||
log.debug "Got neither valid URL nor valid alias:", req.query.input
|
|
||||||
res.status(403).send("Forbidden")
|
|
||||||
return
|
|
||||||
|
|
||||||
# TODO: permission system to check if uid is allowed to play this url or alias
|
|
||||||
|
|
||||||
await vlc.status.empty defer(err)
|
|
||||||
if err
|
|
||||||
res.status(503).send("Something went wrong")
|
|
||||||
log.warn "VLC API returned an error when trying to empty", err
|
|
||||||
return
|
|
||||||
|
|
||||||
# let's give youtube-dl a shot!
|
|
||||||
await youtubedl.getInfo input, [
|
|
||||||
"--format=bestaudio"
|
|
||||||
], defer(err, info)
|
|
||||||
if err or not info?
|
|
||||||
await youtubedl.getInfo input, [
|
|
||||||
"--format=best"
|
|
||||||
], defer(err, info)
|
|
||||||
if err or not info?
|
|
||||||
info =
|
|
||||||
url: input
|
|
||||||
if not info.url?
|
|
||||||
info.url = input
|
|
||||||
info.title = input # URL as title
|
|
||||||
|
|
||||||
await vlc.status.play info.url, defer(err)
|
|
||||||
if err
|
|
||||||
vlc.status.empty()
|
|
||||||
res.status(503).send("Something went wrong")
|
|
||||||
log.warn "VLC API returned an error when trying to play", err
|
|
||||||
return
|
|
||||||
|
|
||||||
res.send JSON.stringify info
|
|
||||||
|
|
||||||
app.get "/stop", (req, res) =>
|
|
||||||
if not req.query.uid
|
|
||||||
log.debug "Didn't get a UID, sending forbidden"
|
|
||||||
res.status(403).send("Forbidden - missing UID")
|
|
||||||
return
|
|
||||||
|
|
||||||
# TODO: permission system to check if uid is allowed to stop playback
|
|
||||||
|
|
||||||
vlc.status.stop()
|
|
||||||
vlc.status.empty()
|
|
||||||
|
|
||||||
res.send("OK")
|
|
||||||
|
|
||||||
app.get "/setvolume", (req, res) =>
|
|
||||||
throw new "Not implemented yet" # FIXME below, still need to implement audio
|
|
||||||
|
|
||||||
@httpServer = app.listen 16444
|
|
||||||
|
|
||||||
cb? null
|
|
||||||
|
|
||||||
stop: (cb) ->
|
|
||||||
@httpServer.close()
|
|
||||||
|
|
||||||
cb?()
|
|
Loading…
Reference in New Issue