Notifications for recording.
This commit is contained in:
@@ -111,8 +111,13 @@ Each event has the following parameters:
|
|||||||
- disconnect: you have disconnected from a server
|
- disconnect: you have disconnected from a server
|
||||||
- msg: the channel you are currently connected to has received a message
|
- msg: the channel you are currently connected to has received a message
|
||||||
- pm: you have received a private message
|
- pm: you have received a private message
|
||||||
|
- recordstart: you have started recording
|
||||||
|
- recordstop: you have stopped recording
|
||||||
|
- recorderror: recording could not start or stopped with an error
|
||||||
|
- userrecordstart: another user has started recording
|
||||||
|
- userrecordstop: another user has stopped recording
|
||||||
* who: the person causing initiation of the event ("me" for self-generated events)
|
* who: the person causing initiation of the event ("me" for self-generated events)
|
||||||
* what: the body of the event as applicable (message, channel name, etc)
|
* what: the body of the event as applicable (message, channel name, recording path, error, etc)
|
||||||
|
|
||||||
Warning:
|
Warning:
|
||||||
Keep in mind that Barnard opens an Alsa sound device when starting.
|
Keep in mind that Barnard opens an Alsa sound device when starting.
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ type Barnard struct {
|
|||||||
UiInputStatus uiterm.Label
|
UiInputStatus uiterm.Label
|
||||||
SelectedChannel *gumble.Channel
|
SelectedChannel *gumble.Channel
|
||||||
selectedUser *gumble.User
|
selectedUser *gumble.User
|
||||||
|
statusText string
|
||||||
|
statusNotice bool
|
||||||
|
|
||||||
notifyChannel chan []string
|
notifyChannel chan []string
|
||||||
|
|
||||||
|
|||||||
+52
-6
@@ -22,6 +22,7 @@
|
|||||||
#
|
#
|
||||||
#--code--
|
#--code--
|
||||||
|
|
||||||
|
# shellcheck disable=SC2329
|
||||||
# 1 is off, 0 is on
|
# 1 is off, 0 is on
|
||||||
notify=0
|
notify=0
|
||||||
sound=0
|
sound=0
|
||||||
@@ -68,17 +69,42 @@ msg() {
|
|||||||
[[ $notify ]] && notify "$1 from $2: $3"
|
[[ $notify ]] && notify "$1 from $2: $3"
|
||||||
}
|
}
|
||||||
|
|
||||||
notify() {
|
notify_fenrir() {
|
||||||
if [[ "$notifyType" == "notify-send" ]]; then
|
local message="$1"
|
||||||
notify-send "$@"
|
local socatFile=""
|
||||||
else
|
if ! command -v socat > /dev/null 2>&1; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
if [[ -e "/tmp/fenrirscreenreader-deamon.sock" ]]; then
|
if [[ -e "/tmp/fenrirscreenreader-deamon.sock" ]]; then
|
||||||
socatFile="/tmp/fenrirscreenreader-deamon.sock"
|
socatFile="/tmp/fenrirscreenreader-deamon.sock"
|
||||||
else
|
else
|
||||||
socatFile="$(find /tmp/ -maxdepth 1 -type s -name 'fenrirscreenreader-*.sock' | head -1)"
|
socatFile="$(find /tmp/ -maxdepth 1 -type s -name 'fenrirscreenreader-*.sock' | head -1)"
|
||||||
fi
|
fi
|
||||||
echo "command say $@" | socat - UNIX-CLIENT:$socatFile
|
if [[ -z "$socatFile" ]]; then
|
||||||
fi
|
return 1
|
||||||
|
fi
|
||||||
|
printf 'command say %s\n' "$message" | socat - "UNIX-CLIENT:$socatFile" > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_speech() {
|
||||||
|
local message="$1"
|
||||||
|
if command -v spd-say > /dev/null 2>&1; then
|
||||||
|
spd-say "$message" > /dev/null 2>&1 && return 0
|
||||||
|
fi
|
||||||
|
if command -v espeak-ng > /dev/null 2>&1; then
|
||||||
|
espeak-ng "$message" > /dev/null 2>&1 && return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
notify() {
|
||||||
|
local message="$*"
|
||||||
|
if [[ "$notifyType" == "notify-send" ]]; then
|
||||||
|
command -v notify-send > /dev/null 2>&1 && notify-send "$@" && return 0
|
||||||
|
else
|
||||||
|
notify_fenrir "$message" && return 0
|
||||||
|
fi
|
||||||
|
notify_speech "$message" || true
|
||||||
}
|
}
|
||||||
|
|
||||||
pm() {
|
pm() {
|
||||||
@@ -86,6 +112,26 @@ pm() {
|
|||||||
[[ $notify ]] && notify "$1 from $2: $3"
|
[[ $notify ]] && notify "$1 from $2: $3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recordstart() {
|
||||||
|
[[ $notify ]] && notify "Recording started."
|
||||||
|
}
|
||||||
|
|
||||||
|
recordstop() {
|
||||||
|
[[ $notify ]] && notify "Recording stopped."
|
||||||
|
}
|
||||||
|
|
||||||
|
recorderror() {
|
||||||
|
[[ $notify ]] && notify "Recording error: $3"
|
||||||
|
}
|
||||||
|
|
||||||
|
userrecordstart() {
|
||||||
|
[[ $notify ]] && notify "$2 started recording."
|
||||||
|
}
|
||||||
|
|
||||||
|
userrecordstop() {
|
||||||
|
[[ $notify ]] && notify "$2 stopped recording."
|
||||||
|
}
|
||||||
|
|
||||||
status() {
|
status() {
|
||||||
# If transmitting: Payphone coin drop tones (1700+2200 Hz simultaneous, like quarter = 5 tones)
|
# If transmitting: Payphone coin drop tones (1700+2200 Hz simultaneous, like quarter = 5 tones)
|
||||||
# If not transmitting: Special Information Tone (SIT) - call failed (913.8, 1370.6, 1776.7 Hz)
|
# If not transmitting: Special Information Tone (SIT) - call failed (913.8, 1370.6, 1776.7 Hz)
|
||||||
|
|||||||
+27
-1
@@ -42,12 +42,14 @@ func (b *Barnard) ToggleRecording() {
|
|||||||
func (b *Barnard) StartRecording() {
|
func (b *Barnard) StartRecording() {
|
||||||
if b.Client == nil || b.Client.Self == nil {
|
if b.Client == nil || b.Client.Self == nil {
|
||||||
b.AddOutputLine("Recording requires an active server connection")
|
b.AddOutputLine("Recording requires an active server connection")
|
||||||
|
b.Notify("recorderror", "me", "Recording requires an active server connection")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
b.RecordingMutex.Lock()
|
b.RecordingMutex.Lock()
|
||||||
if b.recordingAllowed != nil && !*b.recordingAllowed {
|
if b.recordingAllowed != nil && !*b.recordingAllowed {
|
||||||
b.RecordingMutex.Unlock()
|
b.RecordingMutex.Unlock()
|
||||||
b.AddOutputLine("Recording is not allowed by this server.")
|
b.AddOutputLine("Recording is not allowed by this server.")
|
||||||
|
b.Notify("recorderror", "me", "Recording is not allowed by this server.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if b.Recorder != nil || b.recordingStarting {
|
if b.Recorder != nil || b.recordingStarting {
|
||||||
@@ -60,6 +62,7 @@ func (b *Barnard) StartRecording() {
|
|||||||
|
|
||||||
b.Client.Self.SetRecording(true)
|
b.Client.Self.SetRecording(true)
|
||||||
b.AddOutputLine("Recording start requested")
|
b.AddOutputLine("Recording start requested")
|
||||||
|
b.renderGeneralStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Barnard) StopRecording(notifyServer bool) {
|
func (b *Barnard) StopRecording(notifyServer bool) {
|
||||||
@@ -70,20 +73,25 @@ func (b *Barnard) StopRecording(notifyServer bool) {
|
|||||||
}
|
}
|
||||||
if wasPending {
|
if wasPending {
|
||||||
b.AddOutputLine("Recording start cancelled")
|
b.AddOutputLine("Recording start cancelled")
|
||||||
|
b.Notify("recordstop", "me", "Recording start cancelled")
|
||||||
} else {
|
} else {
|
||||||
b.AddOutputLine("Recording is not active")
|
b.AddOutputLine("Recording is not active")
|
||||||
}
|
}
|
||||||
|
b.renderGeneralStatus()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := recorder.Stop(); err != nil {
|
if err := recorder.Stop(); err != nil {
|
||||||
b.AddOutputLine(fmt.Sprintf("Recording stopped with error: %s", err))
|
b.AddOutputLine(fmt.Sprintf("Recording stopped with error: %s", err))
|
||||||
|
b.Notify("recorderror", "me", err.Error())
|
||||||
} else {
|
} else {
|
||||||
b.AddOutputLine(fmt.Sprintf("Recording saved: %s", path))
|
b.AddOutputLine(fmt.Sprintf("Recording saved: %s", path))
|
||||||
|
b.Notify("recordstop", "me", path)
|
||||||
}
|
}
|
||||||
if notifyServer && b.Client != nil && b.Client.Self != nil {
|
if notifyServer && b.Client != nil && b.Client.Self != nil {
|
||||||
b.Client.Self.SetRecording(false)
|
b.Client.Self.SetRecording(false)
|
||||||
}
|
}
|
||||||
|
b.renderGeneralStatus()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Barnard) StopRecordingIfActive(notifyServer bool) {
|
func (b *Barnard) StopRecordingIfActive(notifyServer bool) {
|
||||||
@@ -114,8 +122,10 @@ func (b *Barnard) HandleRecordingChange(e *gumble.UserChangeEvent) {
|
|||||||
}
|
}
|
||||||
if e.User.Recording {
|
if e.User.Recording {
|
||||||
b.AddOutputLine(fmt.Sprintf("%s started recording", e.User.Name))
|
b.AddOutputLine(fmt.Sprintf("%s started recording", e.User.Name))
|
||||||
|
b.Notify("userrecordstart", e.User.Name, "")
|
||||||
} else {
|
} else {
|
||||||
b.AddOutputLine(fmt.Sprintf("%s stopped recording", e.User.Name))
|
b.AddOutputLine(fmt.Sprintf("%s stopped recording", e.User.Name))
|
||||||
|
b.Notify("userrecordstop", e.User.Name, "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,6 +140,7 @@ func (b *Barnard) HandleRecordingAllowed(allowed *bool) {
|
|||||||
b.RecordingMutex.Unlock()
|
b.RecordingMutex.Unlock()
|
||||||
if !value && active {
|
if !value && active {
|
||||||
b.AddOutputLine("Recording is not allowed by this server.")
|
b.AddOutputLine("Recording is not allowed by this server.")
|
||||||
|
b.Notify("recorderror", "me", "Recording is not allowed by this server.")
|
||||||
b.StopRecording(true)
|
b.StopRecording(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -154,7 +165,9 @@ func (b *Barnard) finishRecordingStart() {
|
|||||||
b.recordingStarting = false
|
b.recordingStarting = false
|
||||||
b.RecordingMutex.Unlock()
|
b.RecordingMutex.Unlock()
|
||||||
b.AddOutputLine(fmt.Sprintf("Could not start recording: %s", err))
|
b.AddOutputLine(fmt.Sprintf("Could not start recording: %s", err))
|
||||||
|
b.Notify("recorderror", "me", err.Error())
|
||||||
b.Client.Self.SetRecording(false)
|
b.Client.Self.SetRecording(false)
|
||||||
|
b.renderGeneralStatus()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +184,14 @@ func (b *Barnard) finishRecordingStart() {
|
|||||||
b.Stream.SetRecorder(recorder)
|
b.Stream.SetRecorder(recorder)
|
||||||
}
|
}
|
||||||
b.AddOutputLine(fmt.Sprintf("Recording started: %s", recorder.Path()))
|
b.AddOutputLine(fmt.Sprintf("Recording started: %s", recorder.Path()))
|
||||||
|
b.Notify("recordstart", "me", recorder.Path())
|
||||||
|
b.renderGeneralStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Barnard) isRecordingActive() bool {
|
||||||
|
b.RecordingMutex.Lock()
|
||||||
|
defer b.RecordingMutex.Unlock()
|
||||||
|
return b.Recorder != nil || b.recordingStarting
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Barnard) detachRecorder() (*recording.Recorder, string, bool) {
|
func (b *Barnard) detachRecorder() (*recording.Recorder, string, bool) {
|
||||||
@@ -191,10 +212,15 @@ func (b *Barnard) detachRecorder() (*recording.Recorder, string, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *Barnard) stopRecordingForDisconnect() {
|
func (b *Barnard) stopRecordingForDisconnect() {
|
||||||
recorder, _, _ := b.detachRecorder()
|
recorder, path, _ := b.detachRecorder()
|
||||||
if recorder != nil {
|
if recorder != nil {
|
||||||
if err := recorder.Stop(); err != nil {
|
if err := recorder.Stop(); err != nil {
|
||||||
b.AddOutputLine(fmt.Sprintf("Recording stopped with error: %s", err))
|
b.AddOutputLine(fmt.Sprintf("Recording stopped with error: %s", err))
|
||||||
|
b.Notify("recorderror", "me", err.Error())
|
||||||
|
} else {
|
||||||
|
b.AddOutputLine(fmt.Sprintf("Recording saved: %s", path))
|
||||||
|
b.Notify("recordstop", "me", path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
b.renderGeneralStatus()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,6 +115,14 @@ func (b *Barnard) OnVoiceEffectCycle(ui *uiterm.Ui, key uiterm.Key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *Barnard) UpdateGeneralStatus(text string, notice bool) {
|
func (b *Barnard) UpdateGeneralStatus(text string, notice bool) {
|
||||||
|
b.statusText = text
|
||||||
|
b.statusNotice = notice
|
||||||
|
b.renderGeneralStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Barnard) renderGeneralStatus() {
|
||||||
|
text := b.statusText
|
||||||
|
notice := b.statusNotice
|
||||||
if notice {
|
if notice {
|
||||||
b.UiStatus.Fg = uiterm.ColorWhite | uiterm.AttrBold
|
b.UiStatus.Fg = uiterm.ColorWhite | uiterm.AttrBold
|
||||||
b.UiStatus.Bg = uiterm.ColorRed
|
b.UiStatus.Bg = uiterm.ColorRed
|
||||||
@@ -122,6 +130,16 @@ func (b *Barnard) UpdateGeneralStatus(text string, notice bool) {
|
|||||||
b.UiStatus.Fg = uiterm.ColorBlack
|
b.UiStatus.Fg = uiterm.ColorBlack
|
||||||
b.UiStatus.Bg = uiterm.ColorWhite
|
b.UiStatus.Bg = uiterm.ColorWhite
|
||||||
}
|
}
|
||||||
|
if b.isRecordingActive() {
|
||||||
|
switch strings.TrimSpace(text) {
|
||||||
|
case "Idle":
|
||||||
|
text = " Idle Rec "
|
||||||
|
case "Tx":
|
||||||
|
text = " Tx Rec "
|
||||||
|
case "File":
|
||||||
|
text = " File Rec "
|
||||||
|
}
|
||||||
|
}
|
||||||
b.UiStatus.Text = text
|
b.UiStatus.Text = text
|
||||||
b.Ui.Refresh()
|
b.Ui.Refresh()
|
||||||
}
|
}
|
||||||
@@ -423,6 +441,8 @@ func (b *Barnard) OnUiInitialize(ui *uiterm.Ui) {
|
|||||||
Fg: uiterm.ColorBlack,
|
Fg: uiterm.ColorBlack,
|
||||||
Bg: uiterm.ColorWhite,
|
Bg: uiterm.ColorWhite,
|
||||||
}
|
}
|
||||||
|
b.statusText = b.UiStatus.Text
|
||||||
|
b.statusNotice = false
|
||||||
ui.Add(uiViewStatus, &b.UiStatus)
|
ui.Add(uiViewStatus, &b.UiStatus)
|
||||||
|
|
||||||
b.UiInput = uiterm.Textbox{
|
b.UiInput = uiterm.Textbox{
|
||||||
|
|||||||
Reference in New Issue
Block a user