| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- # 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"
- }
|