From a314aab7ec69ac20098973795d74d62cb3d91fe6 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sat, 20 Jul 2024 19:44:22 -0700 Subject: [PATCH] Web Push Notifications * Add support for Web Push Notifications when users receive a new Message or Friend Request on the main website. * Users opt in or out of this on their Notification Settings. They can also individually opt out of Message and Friend Request push notifications. --- pkg/config/enum.go | 10 + pkg/config/variable.go | 21 ++ pkg/controller/account/settings.go | 25 ++ pkg/controller/friend/request.go | 16 + pkg/controller/inbox/compose.go | 19 ++ pkg/controller/index/index.go | 9 + pkg/models/deletion/delete_user.go | 11 + pkg/models/models.go | 1 + pkg/models/notification_push.go | 85 +++++ pkg/router/router.go | 5 + pkg/webpush/webpush.go | 180 +++++++++++ web/static/img/favicon-128.png | Bin 0 -> 6793 bytes web/static/img/site-settings.png | Bin 0 -> 92267 bytes web/static/js/service-worker.js | 19 ++ web/static/js/web-push.js | 45 +++ web/templates/account/settings.html | 478 ++++++++++++++++++---------- web/templates/base.html | 1 + web/templates/faq.html | 192 ++++++++--- web/templates/inbox/inbox.html | 18 ++ 19 files changed, 921 insertions(+), 214 deletions(-) create mode 100644 pkg/models/notification_push.go create mode 100644 pkg/webpush/webpush.go create mode 100644 web/static/img/favicon-128.png create mode 100644 web/static/img/site-settings.png create mode 100644 web/static/js/service-worker.js create mode 100644 web/static/js/web-push.js diff --git a/pkg/config/enum.go b/pkg/config/enum.go index 2fa7c4b..63b33bd 100644 --- a/pkg/config/enum.go +++ b/pkg/config/enum.go @@ -142,6 +142,10 @@ const ( NotificationOptOutSubscriptions = "notif_optout_subscriptions" NotificationOptOutFriendRequestAccepted = "notif_optout_friend_request_accepted" NotificationOptOutPrivateGrant = "notif_optout_private_grant" + + // Web Push Notifications + PushNotificationOptOutMessage = "notif_optout_push_messages" + PushNotificationOptOutFriends = "notif_optout_push_friends" ) // Notification opt-outs (stored in ProfileField table) @@ -155,3 +159,9 @@ var NotificationOptOutFields = []string{ NotificationOptOutFriendRequestAccepted, NotificationOptOutPrivateGrant, } + +// Push Notification opt-outs (stored in ProfileField table) +var PushNotificationOptOutFields = []string{ + PushNotificationOptOutMessage, + PushNotificationOptOutFriends, +} diff --git a/pkg/config/variable.go b/pkg/config/variable.go index 576c8cd..3edad1b 100644 --- a/pkg/config/variable.go +++ b/pkg/config/variable.go @@ -9,6 +9,7 @@ import ( "code.nonshy.com/nonshy/website/pkg/encryption/coldstorage" "code.nonshy.com/nonshy/website/pkg/encryption/keygen" "code.nonshy.com/nonshy/website/pkg/log" + "github.com/SherClockHolmes/webpush-go" "github.com/google/uuid" ) @@ -31,6 +32,7 @@ type Variable struct { BareRTC BareRTC Maintenance Maintenance Encryption Encryption + WebPush WebPush Turnstile Turnstile UseXForwardedFor bool } @@ -111,6 +113,19 @@ func LoadSettings() { writeSettings = true } + // Initialize the VAPID keys for Web Push Notification. + if len(Current.WebPush.VAPIDPublicKey) == 0 { + privateKey, publicKey, err := webpush.GenerateVAPIDKeys() + if err != nil { + log.Error("Initializing VAPID keys for Web Push: %s", err) + os.Exit(1) + } + + Current.WebPush.VAPIDPrivateKey = privateKey + Current.WebPush.VAPIDPublicKey = publicKey + writeSettings = true + } + // Have we added new config fields? Save the settings.json. if Current.Version != currentVersion || writeSettings { log.Warn("New options are available for your settings.json file. Your settings will be re-saved now.") @@ -181,6 +196,12 @@ type Encryption struct { ColdStorageRSAPublicKey []byte } +// WebPush settings. +type WebPush struct { + VAPIDPublicKey string + VAPIDPrivateKey string +} + // Turnstile (Cloudflare CAPTCHA) settings. type Turnstile struct { Enabled bool diff --git a/pkg/controller/account/settings.go b/pkg/controller/account/settings.go index 187a375..2784bc5 100644 --- a/pkg/controller/account/settings.go +++ b/pkg/controller/account/settings.go @@ -276,6 +276,28 @@ func Settings() http.HandlerFunc { session.Flash(w, r, "Unsubscribed from all comment threads!") } } + case "push_notifications": + hashtag = "#notifications" + + // Store their notification opt-outs. + for _, key := range config.PushNotificationOptOutFields { + var value = r.PostFormValue(key) + + if value == "" { + value = "true" // opt-out, store opt-out=true in the DB + } else if value == "true" { + value = "false" // the box remained checked, they don't opt-out, store opt-out=false in the DB + } + + // Save it. + user.SetProfileField(key, value) + } + session.Flash(w, r, "Notification preferences updated!") + + // Save the user for new fields to be committed to DB. + if err := user.Save(); err != nil { + session.FlashError(w, r, "Failed to save user to database: %s", err) + } case "location": hashtag = "#location" var ( @@ -472,6 +494,9 @@ func Settings() http.HandlerFunc { // Count of subscribed comment threads. vars["SubscriptionCount"] = models.CountSubscriptions(user) + // Count of push notification subscriptions. + vars["PushNotificationsCount"] = models.CountPushNotificationSubscriptions(user) + if err := tmpl.Execute(w, r, vars); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/pkg/controller/friend/request.go b/pkg/controller/friend/request.go index c52a667..c4ba8f4 100644 --- a/pkg/controller/friend/request.go +++ b/pkg/controller/friend/request.go @@ -10,6 +10,7 @@ import ( "code.nonshy.com/nonshy/website/pkg/models" "code.nonshy.com/nonshy/website/pkg/session" "code.nonshy.com/nonshy/website/pkg/templates" + "code.nonshy.com/nonshy/website/pkg/webpush" ) // AddFriend controller to send a friend request. @@ -122,6 +123,21 @@ func AddFriend() http.HandlerFunc { } else { // Log the change. models.LogCreated(currentUser, "friends", user.ID, "Sent a friend request to "+user.Username+".") + + // Send a push notification to the recipient. + go func() { + // Opted out of this one? + if user.GetProfileField(config.PushNotificationOptOutFriends) == "true" { + return + } + + log.Info("Try and send Web Push notification about new Friend Request to: %s", user.Username) + webpush.SendNotification(user, webpush.Payload{ + Topic: "friend", + Title: "New Friend Request!", + Body: fmt.Sprintf("%s wants to be your friend on %s.", currentUser.Username, config.Title), + }) + }() } session.Flash(w, r, "Friend request sent!") } diff --git a/pkg/controller/inbox/compose.go b/pkg/controller/inbox/compose.go index 94e6ce4..ae58f80 100644 --- a/pkg/controller/inbox/compose.go +++ b/pkg/controller/inbox/compose.go @@ -4,9 +4,12 @@ import ( "fmt" "net/http" + "code.nonshy.com/nonshy/website/pkg/config" + "code.nonshy.com/nonshy/website/pkg/log" "code.nonshy.com/nonshy/website/pkg/models" "code.nonshy.com/nonshy/website/pkg/session" "code.nonshy.com/nonshy/website/pkg/templates" + "code.nonshy.com/nonshy/website/pkg/webpush" ) // Compose a new chat coming from a user's profile page. @@ -61,9 +64,25 @@ func Compose() http.HandlerFunc { return } + // Send a push notification to the recipient. + go func() { + // Opted out of this one? + if user.GetProfileField(config.PushNotificationOptOutMessage) == "true" { + return + } + + log.Info("Try and send Web Push notification about new Message to: %s", user.Username) + webpush.SendNotification(user, webpush.Payload{ + Topic: "inbox", + Title: "New Message!", + Body: fmt.Sprintf("%s has left you a message on %s.", currentUser.Username, config.Title), + }) + }() + session.Flash(w, r, "Your message has been delivered!") if from == "inbox" { templates.Redirect(w, fmt.Sprintf("/messages/read/%d", m.ID)) + return } templates.Redirect(w, "/messages") return diff --git a/pkg/controller/index/index.go b/pkg/controller/index/index.go index a57b101..648eece 100644 --- a/pkg/controller/index/index.go +++ b/pkg/controller/index/index.go @@ -38,3 +38,12 @@ func Manifest() http.HandlerFunc { http.ServeFile(w, r, config.StaticPath+"/manifest.json") }) } + +// Service Worker for web push. +func ServiceWorker() http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/javascript; charset=UTF-8") + w.Header().Add("Service-Worker-Allowed", "/") + http.ServeFile(w, r, config.StaticPath+"/js/service-worker.js") + }) +} diff --git a/pkg/models/deletion/delete_user.go b/pkg/models/deletion/delete_user.go index 771ea83..17f9451 100644 --- a/pkg/models/deletion/delete_user.go +++ b/pkg/models/deletion/delete_user.go @@ -55,6 +55,7 @@ func DeleteUser(user *models.User) error { {"User Notes", DeleteUserNotes}, {"Change Logs", DeleteChangeLogs}, {"IP Addresses", DeleteIPAddresses}, + {"Push Notifications", DeletePushNotifications}, } for _, item := range todo { if err := item.Fn(user.ID); err != nil { @@ -361,3 +362,13 @@ func DeleteIPAddresses(userID uint64) error { ).Delete(&models.IPAddress{}) return result.Error } + +// DeletePushNotifications scrubs data for deleting a user. +func DeletePushNotifications(userID uint64) error { + log.Error("DeleteUser: DeletePushNotifications(%d)", userID) + result := models.DB.Where( + "user_id = ?", + userID, + ).Delete(&models.PushNotification{}) + return result.Error +} diff --git a/pkg/models/models.go b/pkg/models/models.go index 6647cc1..f04780e 100644 --- a/pkg/models/models.go +++ b/pkg/models/models.go @@ -33,4 +33,5 @@ func AutoMigrate() { DB.AutoMigrate(&TwoFactor{}) DB.AutoMigrate(&ChangeLog{}) DB.AutoMigrate(&IPAddress{}) + DB.AutoMigrate(&PushNotification{}) } diff --git a/pkg/models/notification_push.go b/pkg/models/notification_push.go new file mode 100644 index 0000000..421f718 --- /dev/null +++ b/pkg/models/notification_push.go @@ -0,0 +1,85 @@ +package models + +import ( + "time" + + "code.nonshy.com/nonshy/website/pkg/log" +) + +// PushNotification table for Web Push subscriptions. +type PushNotification struct { + ID uint64 `gorm:"primaryKey"` + UserID uint64 `gorm:"index"` + Subscription string `gorm:"index"` + CreatedAt time.Time + UpdatedAt time.Time +} + +// RegisterPushNotification stores a registration for the user. +func RegisterPushNotification(user *User, subscription string) (*PushNotification, error) { + // Check for an existing registration. + pn, err := GetPushNotificationFromSubscription(user, subscription) + if err == nil { + return pn, nil + } + + // Create it. + pn = &PushNotification{ + UserID: user.ID, + Subscription: subscription, + } + result := DB.Create(pn) + return pn, result.Error +} + +// GetPushNotificationFromSubscription checks for an existing subscription. +func GetPushNotificationFromSubscription(user *User, subscription string) (*PushNotification, error) { + var ( + pn *PushNotification + result = DB.Model(&PushNotification{}).Where( + "user_id = ? AND subscription = ?", + user.ID, subscription, + ).First(&pn) + ) + return pn, result.Error +} + +// CountPushNotificationSubscriptions returns how many subscriptions the user has for push. +func CountPushNotificationSubscriptions(user *User) int64 { + var count int64 + result := DB.Where( + "user_id = ?", + user.ID, + ).Model(&PushNotification{}).Count(&count) + if result.Error != nil { + log.Error("CountPushNotificationSubscriptions(%d): %s", user.ID, result.Error) + } + return count +} + +// GetPushNotificationSubscriptions returns all subscriptions for a user. +func GetPushNotificationSubscriptions(user *User) ([]*PushNotification, error) { + var ( + pn = []*PushNotification{} + result = DB.Model(&PushNotification{}).Where("user_id = ?", user.ID).Scan(&pn) + ) + return pn, result.Error +} + +// DeletePushNotifications scrubs data for deleting a user. +func DeletePushNotificationSubscriptions(user *User) error { + result := DB.Where( + "user_id = ?", + user.ID, + ).Delete(&PushNotification{}) + return result.Error +} + +// DeletePushNotification removes a single subscription from the database. +func DeletePushNotification(user *User, subscription string) error { + result := DB.Where( + "user_id = ? AND subscription = ?", + user.ID, subscription, + ).Delete(&PushNotification{}) + return result.Error +} diff --git a/pkg/router/router.go b/pkg/router/router.go index a5bb6ba..24b82fd 100644 --- a/pkg/router/router.go +++ b/pkg/router/router.go @@ -21,6 +21,7 @@ import ( "code.nonshy.com/nonshy/website/pkg/controller/poll" "code.nonshy.com/nonshy/website/pkg/middleware" nst "code.nonshy.com/nonshy/website/pkg/templates" + "code.nonshy.com/nonshy/website/pkg/webpush" ) func New() http.Handler { @@ -30,6 +31,7 @@ func New() http.Handler { mux.HandleFunc("/", index.Create()) mux.HandleFunc("GET /favicon.ico", index.Favicon()) mux.HandleFunc("GET /manifest.json", index.Manifest()) + mux.HandleFunc("GET /sw.js", index.ServiceWorker()) mux.HandleFunc("GET /about", index.StaticTemplate("about.html")()) mux.HandleFunc("GET /features", index.StaticTemplate("features.html")()) mux.HandleFunc("GET /faq", index.StaticTemplate("faq.html")()) @@ -111,6 +113,9 @@ func New() http.Handler { mux.HandleFunc("GET /v1/version", api.Version()) mux.HandleFunc("GET /v1/users/me", api.LoginOK()) mux.HandleFunc("POST /v1/users/check-username", api.UsernameCheck()) + mux.HandleFunc("GET /v1/web-push/vapid-public-key", webpush.VAPIDPublicKey) + mux.Handle("POST /v1/web-push/register", middleware.LoginRequired(webpush.Register())) + mux.Handle("GET /v1/web-push/unregister", middleware.LoginRequired(webpush.UnregisterAll())) mux.Handle("POST /v1/likes", middleware.LoginRequired(api.Likes())) mux.Handle("GET /v1/likes/users", middleware.LoginRequired(api.WhoLikes())) mux.Handle("POST /v1/notifications/read", middleware.LoginRequired(api.ReadNotification())) diff --git a/pkg/webpush/webpush.go b/pkg/webpush/webpush.go new file mode 100644 index 0000000..2e1672d --- /dev/null +++ b/pkg/webpush/webpush.go @@ -0,0 +1,180 @@ +// Package webpush provides Web Push Notification functionality. +package webpush + +import ( + "encoding/json" + "fmt" + "net/http" + + "code.nonshy.com/nonshy/website/pkg/config" + "code.nonshy.com/nonshy/website/pkg/controller/api" + "code.nonshy.com/nonshy/website/pkg/log" + "code.nonshy.com/nonshy/website/pkg/models" + "code.nonshy.com/nonshy/website/pkg/session" + "code.nonshy.com/nonshy/website/pkg/templates" + webpush "github.com/SherClockHolmes/webpush-go" +) + +// VAPIDPublicKey returns the site's public key as an endpoint. +func VAPIDPublicKey(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte(config.Current.WebPush.VAPIDPublicKey)) +} + +// UnregisterAll resets a user's stored push notification subscriptions. +func UnregisterAll() http.HandlerFunc { + var next = "/settings#notifications" + + return func(w http.ResponseWriter, r *http.Request) { + currentUser, err := session.CurrentUser(r) + if err != nil { + session.FlashError(w, r, "You must be logged in to do that!") + templates.Redirect(w, next) + return + } + + if err := models.DeletePushNotificationSubscriptions(currentUser); err != nil { + session.FlashError(w, r, "Error removing your subscriptions: %s", err) + } else { + session.Flash(w, r, "Your push notification subscriptions have been reset!") + } + templates.Redirect(w, next) + } +} + +// Register endpoint for push notification. +func Register() http.HandlerFunc { + type Request struct { + Endpoint string `json:"endpoint"` + ExpirationTime float64 `json:"expirationTime"` + Keys struct { + Auth string `json:"auth"` + P256DH string `json:"p256dh"` + } `json:"keys"` + } + + type Response struct { + OK bool `json:"OK"` + Error string `json:"error,omitempty"` + } + + return func(w http.ResponseWriter, r *http.Request) { + currentUser, err := session.CurrentUser(r) + if err != nil { + api.SendJSON(w, http.StatusUnauthorized, Response{ + Error: "You must be logged in to do that!", + }) + return + } + + // Parse request payload. + var req Request + if err := api.ParseJSON(r, &req); err != nil { + api.SendJSON(w, http.StatusBadRequest, Response{ + Error: fmt.Sprintf("Error with request payload: %s", err), + }) + return + } + + // Validate it looked correct. + if req.Endpoint == "" || req.Keys.Auth == "" || req.Keys.P256DH == "" { + api.SendJSON(w, http.StatusBadRequest, Response{ + Error: "Subscription fields were missing.", + }) + return + } + + // Serialize and store it in the database. + buf, err := json.Marshal(req) + if err != nil { + api.SendJSON(w, http.StatusInternalServerError, Response{ + Error: "Couldn't reserialize your subscription!", + }) + return + } + + _, err = models.RegisterPushNotification(currentUser, string(buf)) + if err != nil { + api.SendJSON(w, http.StatusInternalServerError, Response{ + Error: "Couldn't create the registration in the database!", + }) + return + } + + api.SendJSON(w, http.StatusCreated, Response{ + OK: true, + }) + } +} + +// Payload sent in push notifications. +type Payload struct { + Topic string `json:"-"` + Title string `json:"title"` + Body string `json:"body"` +} + +// SendNotification sends a push notification to a user, broadcast to all of their subscriptions. +func SendNotification(user *models.User, body Payload) error { + // Send to all of their subscriptions. + subs, err := models.GetPushNotificationSubscriptions(user) + if err != nil { + return err + } + + payload, err := json.Marshal(body) + if err != nil { + return err + } + + for _, sub := range subs { + if err := SendRawNotification(user, payload, body.Topic, sub.Subscription); err != nil { + log.Error("SendNotification: %s", err) + } + } + + return nil +} + +// SendNotificationToSubscription sends to a specific push subscriber. +func SendNotificationToSubscription(user *models.User, subscription string, body Payload) error { + payload, err := json.Marshal(body) + if err != nil { + return err + } + + return SendRawNotification(user, payload, body.Topic, subscription) +} + +// SendRawNotification sends out a push message. +func SendRawNotification(user *models.User, message []byte, topic, subscription string) error { + // Decode the subscription. + var ( + s = &webpush.Subscription{} + err = json.Unmarshal([]byte(subscription), s) + options = &webpush.Options{ + Topic: topic, + Subscriber: user.Email, + VAPIDPublicKey: config.Current.WebPush.VAPIDPublicKey, + VAPIDPrivateKey: config.Current.WebPush.VAPIDPrivateKey, + TTL: 30, + } + ) + if err != nil { + return err + } + + resp, err := webpush.SendNotification(message, s, options) + if err != nil { + return fmt.Errorf("webpush.SendNotification: %s", err) + } + defer resp.Body.Close() + + // Handle error response codes. + if resp.StatusCode >= 400 { + log.Error("Got StatusCode %d when sending push notification; removing the subscription from DB", resp.StatusCode) + models.DeletePushNotification(user, subscription) + } + + return err +} diff --git a/web/static/img/favicon-128.png b/web/static/img/favicon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..3baf6b96a60151963c6bce4d3be3b343b5a12e14 GIT binary patch literal 6793 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 E4{Wt<@c;k- literal 0 HcmV?d00001 diff --git a/web/static/js/service-worker.js b/web/static/js/service-worker.js new file mode 100644 index 0000000..6a28e44 --- /dev/null +++ b/web/static/js/service-worker.js @@ -0,0 +1,19 @@ +/* nonshy service worker, for web push notifications */ + +self.addEventListener('install', (event) => { + self.skipWaiting(); +}); + +self.addEventListener('push', (event) => { + const payload = JSON.parse(event.data.text()); + try { + event.waitUntil( + self.registration.showNotification(payload.title, { + body: payload.body, + icon: "/static/img/favicon-192.png", + }) + ); + } catch(e) { + console.error("sw.showNotification:", e); + } +}); diff --git a/web/static/js/web-push.js b/web/static/js/web-push.js new file mode 100644 index 0000000..616c7ce --- /dev/null +++ b/web/static/js/web-push.js @@ -0,0 +1,45 @@ +/* nonshy web push notification helper */ +navigator.serviceWorker.register("/sw.js", { + scope: "/", +}).catch(err => { + console.error("Service Worker NOT registered:", err); +}); + +function PushNotificationSubscribe() { + navigator.serviceWorker.ready.then(async function(registration) { + return registration.pushManager.getSubscription().then(async function(subscription) { + // If a subscription was already found, return it. + if (subscription) { + return subscription; + } + + // Get the server's public key. + const response = await fetch("/v1/web-push/vapid-public-key"); + const vapidPublicKey = await response.text(); + + // Subscribe the user. + return registration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: vapidPublicKey, + }); + }).then(subscription => { + + // Post it to the backend. + const serialized = JSON.stringify(subscription); + fetch("/v1/web-push/register", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: serialized + }); + }); + }); +} + +// If the user has already given notification permission, (re)subscribe for push. +document.addEventListener("DOMContentLoaded", e => { + if (Notification.permission === "granted") { + PushNotificationSubscribe(); + } +}); diff --git a/web/templates/account/settings.html b/web/templates/account/settings.html index ba7d67c..6818ef5 100644 --- a/web/templates/account/settings.html +++ b/web/templates/account/settings.html @@ -930,188 +930,279 @@ -
- - -
-

- On this page you may opt-out of certain kinds of (on-site) notification messages. - {{PrettyTitle}} does not send you any e-mails or push notification -- these on-site - notifications only appear while you are visiting the website (on your - home/user dashboard page). -

- -
- {{InputCSRF}} - - -

New Photo Uploads

+
+
+ +

- By default you will be notified when your friends upload a new picture to the site. - Below, you may opt-out of new photo upload notifications. + You may opt-in to receive Web Push Notifications for some of your important updates + from {{PrettyTitle}}, such as when you receive a new Direct Message on the main website, + even when you have closed your browser.

-
- - -

- If unchecked, the following two notifications will not be sent either. +

+ Push Notification Permission: + + + +

+ +

+ + + Test Notifications + + + + +

+ + + {{if .PushNotificationsCount}} +

+ Sessions: you have enabled push notifications on {{.PushNotificationsCount}} web browser{{Pluralize64 .PushNotificationsCount}}. You may + click here to reset your subscriptions. Devices that you actively use + (and had granted permission on before) may re-subscribe on your next visit. +

+ {{end}} + + + + {{InputCSRF}} + + +
+ + +
+
+ +
+ +
+ +
+ + +
+
+ +
+ + +
+

+ On this page you may opt-out of certain kinds of (on-site) notification messages. + {{PrettyTitle}} does not send you any e-mails or push notification -- these on-site + notifications only appear while you are visiting the website (on your + home/user dashboard page). +

+ +
+ {{InputCSRF}} + + +

New Photo Uploads

+ +

+ By default you will be notified when your friends upload a new picture to the site. + Below, you may opt-out of new photo upload notifications.

-
-
- -
+
+ + +

+ If unchecked, the following two notifications will not be sent either. +

+
-
- -

- This will also depend on your opt-in to see explicit content -- otherwise - notifications about explicit photo uploads will not be sent to you. +

+ +
+ +
+ +

+ This will also depend on your opt-in to see explicit content -- otherwise + notifications about explicit photo uploads will not be sent to you. +

+
+ +

Likes & Comments

+ +

+ By default you will be notified when somebody 'likes' or comments on your profile page + or photos. You may turn off those notifications with the options below.

-
-

Likes & Comments

+
+ + +
-

- By default you will be notified when somebody 'likes' or comments on your profile page - or photos. You may turn off those notifications with the options below. -

+
+ +
-
- - -
+

Comment Thread Subscriptions

-
- -
- -

Comment Thread Subscriptions

- -

- Comment threads and forum posts may be 'subscribed' to so that you can be notified about - comments left by other people after you. By default, you will subscribe to comment threads - after you leave your first comment. -

- -

- Note: you may unsubscribe from comment threads by using the link at the - top of its page (for example: at the top of a forum thread page or the top of the list of - comments on a photo page). You may also opt in to get notifications on a thread - that you didn't comment on by using the same link at the top of their pages. -

- -

- The options below can control the automatic opt-in for subscriptions when you leave a - comment on a new comment thread. -

- -
- -
- -
- - -

- You are currently subscribed to {{.SubscriptionCount}} comment thread{{Pluralize64 .SubscriptionCount}}. - You may immediately unsubscribe from all of these threads by checking this box and clicking "Save" below. +

+ Comment threads and forum posts may be 'subscribed' to so that you can be notified about + comments left by other people after you. By default, you will subscribe to comment threads + after you leave your first comment.

-
-

Miscellaneous

- -
- - -
- -
- -
- - -
- -

- This notification is important for your account status, is rarely sent out, and can - not be opted-out from. +

+ Note: you may unsubscribe from comment threads by using the link at the + top of its page (for example: at the top of a forum thread page or the top of the list of + comments on a photo page). You may also opt in to get notifications on a thread + that you didn't comment on by using the same link at the top of their pages.

-
-
- -
+

+ The options below can control the automatic opt-in for subscriptions when you leave a + comment on a new comment thread. +

- +
+ +
+ +
+ + +

+ You are currently subscribed to {{.SubscriptionCount}} comment thread{{Pluralize64 .SubscriptionCount}}. + You may immediately unsubscribe from all of these threads by checking this box and clicking "Save" below. +

+
+ +

Miscellaneous

+ +
+ + +
+ +
+ +
+ + +
+ +

+ This notification is important for your account status, is rarely sent out, and can + not be opted-out from. +

+
+ +
+ +
+ + +
@@ -1143,8 +1234,8 @@

Your Two-Factor is currently: {{if .TwoFactorEnabled}} - - Enabled + + Enabled {{else}} Not Enabled @@ -1462,6 +1553,59 @@ window.addEventListener("DOMContentLoaded", (event) => { }); }); +// Notifications tab scripts. +window.addEventListener("DOMContentLoaded", (event) => { + // Get useful controls from the tab. + const $pushStatusGranted = document.querySelector("#push-status-enabled"), + $pushStatusDenied = document.querySelector("#push-status-disabled"), + $pushStatusDefault = document.querySelector("#push-status-default"), + $pushEnableButton = document.querySelector("#grant-push-permission"), + $pushDeniedHelp = document.querySelector("#push-denied-help"); + + // Get the current permission status: default, granted, denied. + const showPermission = (permission) => { + $pushStatusGranted.style.display = "none"; + $pushStatusDenied.style.display = "none"; + $pushStatusDefault.style.display = "none"; + switch (permission) { + case "granted": + $pushStatusGranted.style.display = ""; + $pushEnableButton.innerHTML = "Test Push Notification"; + break; + case "denied": + $pushEnableButton.style.display = "none"; + $pushDeniedHelp.style.display = ""; + $pushStatusDenied.style.display = ""; + break; + default: + $pushStatusDefault.style.display = ""; + $pushEnableButton.innerHTML = "Grant Push Notification Permission"; + break; + } + }; + showPermission(Notification.permission); + + $pushEnableButton.addEventListener("click", (e) => { + e.preventDefault(); + Notification.requestPermission().then(permission => { + // Update the displayed permission status. + showPermission(Notification.permission); + + // If granted, subscribe to push notifications now. + if (permission === "granted") { + // In static/js/web-push.js + PushNotificationSubscribe(); + + // Test the notification now. + const notification = new Notification(`Hello from ${document.location.hostname}!`, { + body: "This is an example notification from this site.", + icon: "/static/img/favicon-192.png", + }); + } + }); + }); +}); + // Location tab scripts. window.addEventListener("DOMContentLoaded", (event) => { // Get useful controls from the tab. diff --git a/web/templates/base.html b/web/templates/base.html index e13a305..e4c0be9 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -387,6 +387,7 @@ + {{template "scripts" .}} diff --git a/web/templates/faq.html b/web/templates/faq.html index 3f3b268..e91fddc 100644 --- a/web/templates/faq.html +++ b/web/templates/faq.html @@ -70,10 +70,19 @@

+
  • + Notification FAQs + +
  • Shy Account FAQs
      @@ -908,56 +917,75 @@

      What are the technical requirements to use the chat room?

      - The chat room seems to work the best on the following combination of devices and - web browsers: + The chat room should generally work well on all major web browsers, operating systems + and device types. Recommended browsers include Mozilla Firefox, Google Chrome (or any + other Chromium-based browser of your choice, such as Microsoft Edge, Opera or Brave), + or Apple's Safari browser. Most Androids, iPads and iPhones should be able to use the + chat room successfully, including webcam support.

      -
        -
      • - Firefox and Chromium-based web browsers - on all desktop-like operating systems including Windows, Mac OS - and Linux. Chromium-based browsers include Google Chrome, Microsoft Edge, Opera, - Brave or others that are based on the open source Chromium browser. -
      • -
      • - On Android devices, all Firefox and Chromium-based - browsers are generally working quite well. -
      • -
      -

      - The chat room and video sharing generally works well on the above devices. Below - are some that are known to have issues with the chat room at this time: + When opening many webcams: the number of cameras you can watch at a + time is mainly limited by your device's hardware specifications and your local network + bandwidth. The chat room doesn't enforce an arbitrary limit to the number of cameras, + so you can experiment and find out how many your device can support.

      -
        -
      • - Safari on Mac OS X usually works for the text chat portions - (entering the room and chatting), but webcam sharing doesn't seem to work (either - broadcasting or viewing others' cameras). -
      • -
      • - iPhone and iPad (all web browsers) have difficulty logging in to - the chat room at all. Chrome or Firefox do not work on iOS, either - because under - the hood all web browsers on iOS are just custom wrappers around Mobile Safari, - which doesn't like my chat room right now. So unfortunately, Apple mobile devices - can not use the chat room. -
      • -
      +

      + For some examples: a Macbook Air M3 laptop from 2024 is able to comfortably open more + than 20 webcams at a time. However, a Dell XPS 13 laptop from 2018 (which had 16GB RAM, + an nVIDIA graphics card, etc.) was seen to only be able to open 10 or 15 cameras before + the laptop became very warm. +

      -

      I can't share or connect to other peoples' webcams

      +

      I am experiencing a problem with webcam sharing

      - First, verify that you're using a known supported device + Please see the Webcam Troubleshooting + thread in the forums for some advice on things to try. +

      + +

      + Verify that you're using a known supported device when accessing the chat room. Generally this means you're running a Firefox or - Chromium-based browser on a desktop computer, laptop, or Android device. Webcam - sharing does not work at all in Safari on Mac OS, and portable - Apple devices such as iPad and iPhone do not work with the chat room at all. + Chromium-based browser on a desktop computer, laptop, or Android device. The Apple + Safari browser should also work from a Mac, iPhone or iPad computer. +

      + +

      + The most common type of error message people encounter on chat looks like: + NotAllowedError: Permission denied. This error message usually has + one of three causes: +

      + +
        +
      1. + Your web browser has denied permission to chat.nonshy.com, and you should check in + your web browser's settings (Privacy & Security section) for Webcam and Microphone + and remove chat.nonshy.com from the list of sites. After doing so, restart your browser + and log onto the chat room, and be sure to click "Allow" when it asks for permission + when going on webcam. +
      2. +
      3. + Sometimes, your operating system itself is actually denying permission to your web + browser. You can check in your System Settings for App Permissions for your webcam + and microphone, and ensure that your web browser has this permission on your device. +
      4. +
      5. + Sometimes this error comes up when your webcam is already in use by another + application (such as Skype or Discord). Ensure that there is no other app currently + using your webcam before you go on camera in the chat room. +
      6. +
      + +

      + The linked Webcam Troubleshooting thread above has instructions for common web browsers + and operating systems on where to check for permission errors.

      If you are on a supported device, check out the following information about how - webcam sharing works: + webcam sharing works in general:

        @@ -1017,15 +1045,6 @@
      -

      - If all else fails, it's unfortunate but at least the text chat functions should work at least. - Some big video apps like Zoom or Jitsi Meet tend to work better because, if you can't establish - a peer-to-peer connection, they will fall back on using a proxy server to transmit your video - through to the other party. The {{PrettyTitle}} chat room does not have such a proxy server -- - because the bandwidth can get expensive to carry video across! Only peer-to-peer video sharing - is supported at this time. -

      -

      Where can I learn more about the chat room?

      @@ -1033,6 +1052,85 @@ a tour of the chat room interface and some additional information about how to use the chat room.

      +

      Notification FAQs

      + +

      Does nonshy send me notifications?

      + +

      + Most {{PrettyTitle}} notifications are "on-site only" by default, meaning you need to log onto + the website to see them. We send very few e-mails from this website, ever: only for + your new account verification e-mail, certification photo approval, and when you forgot your password. +

      + +

      + The on-site notifications include things like when your friends upload a new picture, or when somebody + comments on or likes something you posted. You can manage your {{PrettyTitle}} notifications on your + Notification Settings page, to opt in or out of any of these. +

      + +

      + We have optional Web Push Notifications that you may enable so you can + know when somebody has left you a message or a friend request on the website. +

      + +

      About Web Push Notifications

      + +

      + If you would like to enable timely notifications when you receive a new Message or Friend Request + on the website, you may enable Web Push Notifications in your + settings. +

      + +

      + Currently, only a small subset of the site notifications can be sent via push notification: when you + get a new Direct Message or Friend Request. You may opt either of those out, in case you only care to + be notified about messages but not friend requests. +

      + +

      + All your other notifications (likes, comments, etc.) are still "on-site only" so you will need to log in + and check your Dashboard Page to catch up on those. +

      + +

      How do I turn off Web Push Notifications?

      + +

      + The easiest way to turn these off is to revoke your Notifications permission given to the nonshy website. +

      + +

      + On Firefox, Chrome and Chrome-like web browsers: in your URL address bar there should be a button to the + left of address which you can click on and see permissions for the website, where the "Notification" permission + can be easily revoked. +

      + + A screenshot of the Google Chrome settings drop-down near the address bar. + +

      + On other web browsers (or on mobile) you may need to go into your browser's settings. Under a section for + "Websites" (maybe under "Privacy & Security"), find the {{PrettyTitle}} website or the Notifications permission + and you can change your setting there. +

      + +

      Troubleshooting Web Push Notifications

      + +

      + When you first enable Web Push Notifications, your web browser should have prompted you for permission. In case + you have clicked "Deny" or "Never Allow," your web browser remembers your decision and the website is not allowed + to ask again. +

      + +

      + When this happens, the Notification Settings page will say that you have "Denied" + notification permission. +

      + +

      + In case you want to undo this: you will need to change or reset your Notification permission for this website. Please + see the previous answer for places to look. After you have reset your Notification permission, + refresh the Notification Settings page and try enabling notifications again. +

      +

      Shy Account FAQs

      diff --git a/web/templates/inbox/inbox.html b/web/templates/inbox/inbox.html index b266fdd..e0db5f9 100644 --- a/web/templates/inbox/inbox.html +++ b/web/templates/inbox/inbox.html @@ -207,6 +207,13 @@ other column to read the conversation here.

      + + +

      Pro Tip: @@ -335,3 +342,14 @@

  • {{end}} +{{define "scripts"}} + +{{end}} \ No newline at end of file