Jump to content
EGGTCL

About This File

# funwar.tcl
#
# This script was created to post fun clan wars/matches for the two multiplayer
# games RTCW and ET in channels periodically and with the commands below. The
# matches are retrieved from tables in postreSQL databases.
#
# Usage:
#       !et                     post ET matches
#       !rtcw                   post RTCW matches
#       !funwars                post ET and RTCW matches
#
# Enable for a channel with:    .chanset #channel +funwar
# Disable for a channel with:   .chanset #channel -funwar
#
# See https://github.com/hwipl/eggdrop-scripts for the latest version and
# additional information including the license (MIT).

# tested versions, might run on earlier versions
package require Tcl 8.6
package require eggdrop 1.8.4

# postgres sql
package require tdbc::postgres

namespace eval ::funwar {
	# channel flag for enabling/disabling
	setudef flag funwar

	# sql server address, username and password
	variable sqlServer "eggdroppostgres"
	variable sqlUser "eggdrop"
	variable sqlPassword "eggdropPassword"

	# ET database and table on sql server
	variable sqlDbnameEt "postgres"
	variable sqlTblnameEt "test.funmatch"

	# RTCW database and table on sql server
	variable sqlDbnameRtcw "postgres"
	variable sqlTblnameRtcw "test.funmatch"

	# crontab style definition of how often funwars are posted in channels
	# format:
	#       "MIN HOUR DAY MONTH YEAR"
	# examples:
	#       "20,50 * * * *"         post at minute 20 and 50 of every hour
	#       "*/10 * * * *"          post every ten minutes
	variable autoCron "20,50 * * * *"

	# trigger configuration for ET, RTCW and both
	variable triggerEt "!et"
	variable triggerRtcw "!rtcw"
	variable triggerBoth "!funwars"

	# output configuration
	variable outputHeader "*** Funwars: ***"
	variable outputHeader2 "Game: Date/Time: XonX: Clantag: IRC:"
	variable outputFooter "*** end of funwars list ***"
}

# post the funwar header in the channel
proc ::funwar::postHeader {chan} {
	variable outputHeader
	variable outputHeader2
	set fmt "%-7s %-20s %-6s %-12s %-12s"
	set lineHeader [format $fmt {*}$outputHeader2]

	puthelp "PRIVMSG $chan :$outputHeader"
	puthelp "PRIVMSG $chan :$lineHeader"
}

# post a funwar line in the channel
proc ::funwar::post {game id date time xonx clantag irc www server org chan } {
	set fmt "%-7s %-20s %-6s %-12s %-12s"
	set outputBody [format $fmt $game $date/$time $xonx $clantag $irc]

	puthelp "PRIVMSG $chan :$outputBody"
}

# post the funwar footer in the channel
proc ::funwar::postFooter {chan} {
	variable outputFooter

	puthelp "PRIVMSG $chan :$outputFooter"
}

# get rows from sql table
proc ::funwar::sqlGet {server user password dbname tblname order limit} {
	# connect to data base
	# add -sslmode require if you want to enforce ssl
	tdbc::postgres::connection create db -host $server -database $dbname \
		-user $user -password $password

	# query table in data base
	set columns "id,date,time,xonx,clantag,irc,www,server,org"
	set top "FETCH FIRST $limit ROWS ONLY"
	set queryStr "SELECT $columns FROM $tblname ORDER BY $order DESC $top"
	set query [db prepare $queryStr]

	# collect all rows and return them
	set rows ""
	$query foreach row {
		lappend rows $row
	}
	$query close
	db close

	return $rows
}

# query db, parse everything and post in channels
proc ::funwar::sqlParsedb {server user password dbname tblname order chan \
	game limit command} {
	# query rows from table in database
	set rows [sqlGet $server $user $password $dbname $tblname $order \
		$limit]
	if {$rows == ""} {
		return
	}

	if { $command != "noheader" } {
		# post header in every given channel
		foreach channel $chan {
			postHeader $channel
		}
	}

	# parse earch row and post them in channels
	foreach row $rows {
		set id [dict get $row id]
		set date [dict get $row date]
		set time [dict get $row time]
		set xonx [dict get $row xonx]
		set clantag [dict get $row clantag]
		set irc [dict get $row irc]
		set www [dict get $row www]
		set server [dict get $row server]
		set org [dict get $row org]

		foreach channel $chan {
			# post row in every given channel
			post $game $id $date $time $xonx $clantag $irc $www \
				$server $org $channel
		}
	}

	if { $command != "nofooter" } {
		# post footer in every given channel
		foreach channel $chan {
			postFooter $channel
		}
	}
}

# helper for posting rtcw entries
proc ::funwar::postRtcw {chan limit command} {
	variable sqlServer
	variable sqlUser
	variable sqlPassword
	variable sqlDbnameRtcw
	variable sqlTblnameRtcw

	set order "id"
	set game "RTCW"

	sqlParsedb $sqlServer $sqlUser $sqlPassword $sqlDbnameRtcw \
		$sqlTblnameRtcw $order $chan $game $limit $command
}

# helper for posting et entries
proc ::funwar::postEt {chan limit command} {
	variable sqlServer
	variable sqlUser
	variable sqlPassword
	variable sqlDbnameEt
	variable sqlTblnameEt

	set order "id"
	set game "ET"

	sqlParsedb $sqlServer $sqlUser $sqlPassword $sqlDbnameEt \
		$sqlTblnameEt $order $chan $game $limit $command
}

# handle the !rtcw trigger
proc ::funwar::rtcw { nick host hand chan arg } {
	# check channel flag if enabled in this channel
	if {![channel get $chan funwar]} {
		return 0
	}

	set limit "10"
	set command ""
	postRtcw $chan $limit $command

	return 1
}

# handle the !et trigger
proc ::funwar::et { nick host hand chan arg } {
	# check channel flag if enabled in this channel
	if {![channel get $chan funwar]} {
		return 0
	}

	set limit "10"
	set command ""
	postEt $chan $limit $command

	return 1
}

# handle the !funwars trigger
proc ::funwar::both { nick host hand chan arg } {
	# check channel flag if enabled in this channel
	if {![channel get $chan funwar]} {
		return 0
	}

	set limit "3"
	set command "nofooter"
	postRtcw $chan $limit $command

	set command "noheader"
	postEt $chan $limit $command

	return 1
}

# handle cron auto posting
proc ::funwar::auto { min hour day month year } {
	# determine list of channels to post in based on channel flag
	set autoChannels ""
	foreach botChan [channels] {
		# only use channels the bot is on and have the flag enabled
		if {![botonchan $botChan] || ![channel get $botChan funwar]} {
			continue
		}
		lappend autoChannels $botChan
	}
	if {$autoChannels == ""} {
		# no channels to post in
		return
	}

	set limit "3"
	set command "nofooter"
	postRtcw $autoChannels $limit $command

	set command "noheader"
	postEt $autoChannels $limit $command
}

namespace eval ::funwar {
	bind pub - $triggerEt ::funwar::et
	bind pub - $triggerRtcw ::funwar::rtcw
	bind pub - $triggerBoth ::funwar::both
	bind cron - $autoCron ::funwar::auto
	putlog "Loaded funwars.tcl"
}

 


What's New in Version 1.0.0   See changelog

Released

No changelog available for this version.


User Feedback

Create an account or sign in to leave a review

You need to be a member in order to leave a review

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

There are no reviews to display.

×
×
  • Create New...