diff --git a/extra/irc/gitbot/gitbot.factor b/extra/irc/gitbot/gitbot.factor new file mode 100644 index 0000000000..93ccb2b407 --- /dev/null +++ b/extra/irc/gitbot/gitbot.factor @@ -0,0 +1,55 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: fry irc.client irc.client.private kernel namespaces +sequences threads io.encodings.8-bit io.launcher io splitting +make mason.common mason.updates calendar math alarms ; +IN: irc.gitbot + +: bot-profile ( -- obj ) + "irc.freenode.org" 6667 "jackass" f ; + +: bot-channel ( -- seq ) "#concatenative" ; + +GENERIC: handle-message ( msg -- ) + +M: object handle-message drop ; + +: bot-loop ( chat -- ) + dup hear handle-message bot-loop ; + +: start-bot ( -- chat ) + bot-profile + [ connect-irc ] + [ + [ bot-channel dup ] dip + '[ _ [ _ attach-chat ] [ bot-loop ] bi ] + "GitBot" spawn drop + ] bi ; + +: git-log ( from to -- lines ) + [ + "git-log" , + "--no-merges" , + "--pretty=format:%h %an: %s" , + ".." swap 3append , + ] { } make + latin1 [ input-stream get lines ] with-process-reader ; + +: updates ( from to -- lines ) + git-log reverse + dup length 4 > [ 4 head "... and more" suffix ] when ; + +: report-updates ( from to chat -- ) + [ updates ] dip + [ 1 seconds sleep ] swap + '[ _ speak ] interleave ; + +: check-for-updates ( chat -- ) + [ git-id git-pull-cmd short-running-process git-id ] dip + report-updates ; + +: bot ( -- ) + start-bot + '[ _ check-for-updates ] 5 minutes every drop ; + +MAIN: bot