diff --git a/extra/site-watcher/db/db.factor b/extra/site-watcher/db/db.factor index 7b78488557..fa8a586ae1 100644 --- a/extra/site-watcher/db/db.factor +++ b/extra/site-watcher/db/db.factor @@ -12,8 +12,7 @@ TUPLE: account account-id account-name email ; swap >>account-name ; account "ACCOUNT" { - { "account-id" "ACCOUNT_ID" +db-assigned-id+ } - { "account-name" "ACCOUNT_NAME" VARCHAR } + { "account-name" "ACCOUNT_NAME" VARCHAR +user-assigned-id+ } { "email" "EMAIL" VARCHAR } } define-persistent @@ -33,15 +32,15 @@ site "SITE" { { "last-error" "LAST_ERROR" TIMESTAMP } } define-persistent -TUPLE: watching-site account-id site-id ; +TUPLE: watching-site account-name site-id ; -: ( account-id site-id -- watching-site ) +: ( account-name site-id -- watching-site ) watching-site new swap >>site-id - swap >>account-id ; + swap >>account-name ; watching-site "WATCHING_SITE" { - { "account-id" "ACCOUNT_ID" INTEGER +user-assigned-id+ } + { "account-name" "ACCOUNT_NAME" VARCHAR +user-assigned-id+ } { "site-id" "SITE_ID" INTEGER +user-assigned-id+ } } define-persistent @@ -71,22 +70,23 @@ TUPLE: reporting-site email url up? changed? last-up? error last-error ; "update site set changed = 'f';" sql-command ; : insert-site ( url -- site ) - dup select-tuple [ - dup t >>up? insert-tuple - ] unless ; + dup select-tuple [ ] [ dup t >>up? insert-tuple ] ?if ; : insert-account ( account-name -- ) insert-tuple ; : find-sites ( -- seq ) f select-tuples ; -: select-account/site ( email url -- account site ) - [ select-tuple account-id>> ] - [ insert-site site-id>> ] bi* ; +: select-account/site ( username url -- account site ) + insert-site site-id>> ; PRIVATE> -: watch-site ( email url -- ) +: watch-site ( username url -- ) select-account/site insert-tuple ; -: unwatch-site ( email url -- ) +: unwatch-site ( username url -- ) select-account/site delete-tuples ; + +: watching-sites ( username -- sites ) + f select-tuples + [ site-id>> site new swap >>site-id select-tuple ] map ; \ No newline at end of file diff --git a/extra/site-watcher/site-watcher.factor b/extra/site-watcher/site-watcher.factor index 163c47022d..29a66afb13 100644 --- a/extra/site-watcher/site-watcher.factor +++ b/extra/site-watcher/site-watcher.factor @@ -44,14 +44,13 @@ SYMBOL: running-site-watcher PRIVATE> -: watch-sites ( -- alarm ) - [ - find-sites check-sites sites-to-report send-reports - ] site-watcher-frequency get every ; +: watch-sites ( -- ) + find-sites check-sites sites-to-report send-reports ; : run-site-watcher ( -- ) running-site-watcher get [ - watch-sites running-site-watcher set-global + [ watch-sites ] site-watcher-frequency get every + running-site-watcher set-global ] unless ; : stop-site-watcher ( -- ) diff --git a/extra/webapps/site-watcher/main.xml b/extra/webapps/site-watcher/main.xml new file mode 100644 index 0000000000..938ff09825 --- /dev/null +++ b/extra/webapps/site-watcher/main.xml @@ -0,0 +1,7 @@ + + + + +

SiteWatcher is a free service for web masters. It periodically tries fetching your web site via HTTP, and sends you an e-mail, SMS or Tweet if this fails. Sign up now!

+ +
diff --git a/extra/webapps/site-watcher/site-list.xml b/extra/webapps/site-watcher/site-list.xml index 9bd1467fc7..c96a25f443 100644 --- a/extra/webapps/site-watcher/site-list.xml +++ b/extra/webapps/site-watcher/site-list.xml @@ -2,40 +2,31 @@ - - - SiteWatcher - - -

SiteWatcher

-

It tells you if your web site goes down.

- - - - - - - -
Remove
-

- Check now -

-
-

Add a new site

- - - - - - - - - - -
URL:
E-mail:
-

-
- - +

Don't you hate it when your web site goes down, and all your users go buy that slanket from your competitor instead. Now using SiteWatcher, you can ensure this will never happen again!

+ +Contact info + +

Step 2: add some sites to watch

+ + + + +
URL:
+
+ +

Step 3: keep track of your sites

+ + + + + + + + + +
URL
Remove
+

+ Check now +

diff --git a/extra/webapps/site-watcher/site-watcher.factor b/extra/webapps/site-watcher/site-watcher.factor index a71a14a37a..50ca50ad11 100644 --- a/extra/webapps/site-watcher/site-watcher.factor +++ b/extra/webapps/site-watcher/site-watcher.factor @@ -1,31 +1,51 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors furnace.actions furnace.alloy furnace.redirection -html.forms http.server http.server.dispatchers namespaces site-watcher -site-watcher.private kernel urls validators db.sqlite assocs ; +USING: accessors assocs db.sqlite furnace.actions furnace.alloy +furnace.auth furnace.auth.features.deactivate-user +furnace.auth.features.edit-profile +furnace.auth.features.recover-password +furnace.auth.features.registration furnace.auth.login +furnace.boilerplate furnace.redirection html.forms http.server +http.server.dispatchers kernel namespaces site-watcher site-watcher.db +site-watcher.private urls validators io.sockets.secure.unix.debug +io.servers.connection db db.tuples sequences ; +QUALIFIED: assocs IN: webapps.site-watcher TUPLE: site-watcher-app < dispatcher ; CONSTANT: site-list-url URL" $site-watcher-app/" +: ( -- action ) + + [ + logged-in? + [ URL" $site-watcher-app/list" ] + [ { site-watcher-app "main" } ] if + ] >>display ; + : ( -- action ) { site-watcher-app "site-list" } >>template [ - begin-form - sites get values "sites" set-value - ] >>init ; + ! Silly query + username watching-sites + "sites" set-value + ] >>init + + "list watched sites" >>description ; : ( -- action ) [ - { { "url" [ v-url ] } { "email" [ v-email ] } } validate-params + { { "url" [ v-url ] } } validate-params ] >>validate [ - "email" value "url" value watch-site + username "url" value watch-site site-list-url - ] >>submit ; + ] >>submit + + "add a watched site" >>description ; : ( -- action ) @@ -33,22 +53,79 @@ CONSTANT: site-list-url URL" $site-watcher-app/" { { "url" [ v-url ] } } validate-params ] >>validate [ - "url" value delete-site + username "url" value unwatch-site site-list-url - ] >>submit ; + ] >>submit + + "remove a watched site" >>description ; : ( -- action ) [ - sites get [ check-sites ] [ report-sites ] bi + watch-sites site-list-url - ] >>submit ; + ] >>submit + + "check watched sites" >>description ; + +: ( -- action ) + + [ + username select-tuple from-object + ] >>init + { site-watcher-app "update-notify" } >>template + [ + { + { "email" [ [ v-email ] v-optional ] } + { "twitter" [ [ v-one-word ] v-optional ] } + { "sms" [ [ v-one-line ] v-optional ] } + } validate-params + ] >>validate + [ + username select-tuple + "email" value >>email + update-tuple + site-list-url + ] >>submit + + "update notification details" >>description ; : ( -- dispatcher ) site-watcher-app new-dispatcher - "" add-responder + "" add-responder + "list" add-responder "add" add-responder "remove" add-responder - "check" add-responder ; + "check" add-responder + "update-notify" add-responder ; - "resource:test.db" main-responder set-global \ No newline at end of file +: ( responder -- responder' ) + "SiteWatcher" + "SiteWatcher" >>name + allow-registration + allow-password-recovery + allow-edit-profile + allow-deactivation ; + +: ( -- threaded-server ) + + >>secure-config + 8081 >>insecure + 8431 >>secure ; + +: site-watcher-db ( -- db ) + "resource:test.db" ; + + + + { site-watcher-app "site-watcher" } >>template +site-watcher-db +main-responder set-global + +: start-site-watcher ( -- ) + start-server ; + +: init-db ( -- ) + site-watcher-db [ + { site account watching-site } [ ensure-table ] each + ] with-db ; \ No newline at end of file diff --git a/extra/webapps/site-watcher/site-watcher.xml b/extra/webapps/site-watcher/site-watcher.xml new file mode 100644 index 0000000000..5b2b129e27 --- /dev/null +++ b/extra/webapps/site-watcher/site-watcher.xml @@ -0,0 +1,16 @@ + + + + + + + SiteWatcher + + +

SiteWatcher

+

It tells you if your web site goes down.

+ + + + +
diff --git a/extra/webapps/site-watcher/update-notify.xml b/extra/webapps/site-watcher/update-notify.xml new file mode 100644 index 0000000000..02075de95c --- /dev/null +++ b/extra/webapps/site-watcher/update-notify.xml @@ -0,0 +1,16 @@ + + + + +

Enter your contact details

+ + + + + + +
E-mail:
Twitter:
SMS:
+

+
+ +