#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 (YES v2 explicitly defined here.)
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
#	(tcl@kofee.org)
##########################################################

#########################
#	Changelog	#
#########################
#
#
#
#

##########################################################
## CONFIG START ##

# PATH to dcop binary
set dcop_bin		"/usr/kde/3.5/bin/dcop"
# PATH to sed binary
set sed_bin 		"/bin/sed"
# The app we want to control via DCOP (amarok indeed)
set dcop_app		"amarok"

## CONFIG END ##
##########################################################
## BindZ ##
# CONTROL
bind pub o	amarok:play		amarok:play
bind pub o	amarok:stop		amarok:stop
bind pub o	amarok:pause		amarok:pause
bind pub o	amarok:playpause	amarok:playpause
bind pub o	amarok:pp		amarok:playpause
bind pub o	amarok:next		amarok:next
bind pub o	amarok:prev		amarok:prev

# INFOS
bind pub -	amarok:np		amarok:nowplaying
bind pub -	amarok:playing		amarok:nowplaying
bind pub -	amarok:nowplaying	amarok:nowplaying

# FILE TRANSFER
bind pub -	amarok:send		amarok:send
bind pub -	amarok:get		amarok:send
bind pub -	gimme			amarok:send
##########################################################
##	!! Don't EDIT below this line !!		##
##########################################################

###############
### CONTROL ###
###############

proc amarok:play {nick host handle chan arg} {
	global dcop_bin dcop_app
	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		putlog "$status"
		return 0
	}

	# C'est déjà en lecture ?
	if { $status == "2" } {
		set play_song [eval exec "$dcop_bin $dcop_app player title"]
		set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
		putlog "$play_song"
		putserv "PRIVMSG $chan :$dcop_app est déjà entrain de jouer \
			 \"$play_song\" de $play_artist :p"
		return 0
	}
	
	# sinon soit c'est pause soit c'est stop .. donc on lance =)
	eval exec "$dcop_bin $dcop_app player play"
	set play_song [eval exec "$dcop_bin $dcop_app player title"]
	set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
	putlog "$play_song"
	putserv "PRIVMSG $chan :$dcop_app joue \"$play_song\" de $play_artist"
	return 0
}

proc amarok:stop {nick host handle chan arg} {
	global dcop_bin dcop_app

	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		return 0
	}

	# C'est déjà arrêté ...
	if { $status == "0" } {
		putserv "PRIVMSG $chan :$dcop_app est déjà stoppé :p"
		return 0
	}

	# sinon on cherche pas a comprendre on stop ..
	eval exec "$dcop_bin $dcop_app player stop"
	putserv "PRIVMSG $chan :$dcop_app devrait être stoppé..."
	return 0
}

proc amarok:pause {nick host handle chan arg} {
	global dcop_bin dcop_app

	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		return 0
	}

	# C'est arrêté ...
	if { $status == "0" } {
		putserv "PRIVMSG $chan :$dcop_app est stoppé je vois \
			pas l'intérêt de le mettre en pause :p"
		return 0
	}

	# C'est déjà en pause...
	if { $status == "1" } {
		set play_song [eval exec "$dcop_bin $dcop_app player title"]
		set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
		set play_total_time [eval exec "$dcop_bin $dcop_app player totalTime"]
		set play_current_time [eval exec "$dcop_bin $dcop_app player currentTime"]
		putserv "PRIVMSG $chan :$dcop_app est déjà en pause sur \"$play_song\"\
			de $play_artist à $play_current_time / $play_total_time :p"
		return 0
	}

	# sinon c'est en lecture donc on met en pause =)
	eval exec "$dcop_bin $dcop_app player pause"
	set play_song [eval exec "$dcop_bin $dcop_app player title"]
	set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
	set play_total_time [eval exec "$dcop_bin $dcop_app player totalTime"]
	set play_current_time [eval exec "$dcop_bin $dcop_app player currentTime"]
	putserv "PRIVMSG $chan :$dcop_app en pause sur \"$play_song\" de $play_artist \
		à $play_current_time / $play_total_time :)"
	return 0
}

proc amarok:playpause {nick host handle chan arg} {
	global dcop_bin dcop_app

	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		return 0
	}

	# C'est arrêté ou en pause.
	if { $status == "0" || $status == "1" } {
		amarok:play $nick $host $handle $chan $arg
	}
	# C'est en cours de lecture
	if { $status == "2" } {
		amarok:pause $nick $host $handle $chan $arg
	}
	return 0
}




#############
### INFOS ###
#############

proc amarok:nowplaying {nick host handle chan arg} {
	global dcop_bin dcop_app

	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		return 0
	}

	# C'est arrêté ou en pause.
	if { $status == "0" || $status == "1" } {
		putserv "PRIVMSG $chan :$nick, $dcop_app ne joue rien la .."
		return 0
	}

	set play_song [eval exec "$dcop_bin $dcop_app player title"]
	set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
	set play_total_time [eval exec "$dcop_bin $dcop_app player totalTime"]
	set play_current_time [eval exec "$dcop_bin $dcop_app player currentTime"]
	putserv "PRIVMSG $chan :$dcop_app joue \"$play_song\" de $play_artist \
		à $play_current_time / $play_total_time :)"
	return 0
}


#####################
### FILE TRANSFER ###
#####################

proc amarok:send {nick host handle chan arg} {
	global dcop_bin dcop_app sed_bin
	set status [eval exec "$dcop_bin $dcop_app player status"]
	putlog "$dcop_app status: $status"

	# a t on une erreur ?
	if { $status < 0 } {
		putserv "PRIVMSG $chan :ERREUR, code: \"$status\""
		return 0
	}

	# C'est arrêté ou en pause.
	if { $status == "0" || $status == "1" } {
		putserv "PRIVMSG $chan :$nick, $dcop_app ne joue rien la .. donc je ne t'enverrais rien :p"
		return 0
	}

	set play_song [eval exec "$dcop_bin $dcop_app player title"]
	set play_artist [eval exec "$dcop_bin $dcop_app player artist"]
	set play_file_url [eval exec "$dcop_bin $dcop_app player path | $sed_bin -e \"s/\ /\\\ /g\""]
	putlog "$play_file_url"

	# On prévient le bonhomme ;)
	putserv "PRIVMSG $nick : Je vais essayer de t'envoyer $play_song de $play_artist ,\
		 fichier: $play_file_url"
	dccsend $play_file_url $nick
	return 0
}



##########################################################
putlog "$dcop_app control loaded"
##########################################################