mirror of
				https://github.com/binwiederhier/ntfy.git
				synced 2025-10-31 13:02:24 +01:00 
			
		
		
		
	Merge branch 'main' of github.com:binwiederhier/ntfy into icons
This commit is contained in:
		
						commit
						ae1fb74ac6
					
				
					 26 changed files with 3233 additions and 2934 deletions
				
			
		.github
MakefileREADME.mdclient
cmd
docs
go.modgo.summkdocs.ymlserver
web
							
								
								
									
										1
									
								
								.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| github: [binwiederhier] | ||||
							
								
								
									
										7
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,5 +1,6 @@ | |||
| MAKEFLAGS := --jobs=1 | ||||
| VERSION := $(shell git describe --tag) | ||||
| COMMIT := $(shell git rev-parse --short HEAD) | ||||
| 
 | ||||
| .PHONY: | ||||
| 
 | ||||
|  | @ -169,7 +170,7 @@ cli-linux-server: cli-deps-static-sites | |||
| 		-o dist/ntfy_linux_server/ntfy \
 | ||||
| 		-tags sqlite_omit_load_extension,osusergo,netgo \
 | ||||
| 		-ldflags \
 | ||||
| 		"-linkmode=external -extldflags=-static -s -w -X main.version=$(VERSION) -X main.commit=$(shell git rev-parse --short HEAD) -X main.date=$(shell date +%s)" | ||||
| 		"-linkmode=external -extldflags=-static -s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" | ||||
| 
 | ||||
| cli-darwin-server: cli-deps-static-sites | ||||
| 	# This is a target to build the CLI (including the server) manually. | ||||
|  | @ -179,7 +180,7 @@ cli-darwin-server: cli-deps-static-sites | |||
| 		-o dist/ntfy_darwin_server/ntfy \
 | ||||
| 		-tags sqlite_omit_load_extension,osusergo,netgo \
 | ||||
| 		-ldflags \
 | ||||
| 		"-linkmode=external -s -w -X main.version=$(VERSION) -X main.commit=$(shell git rev-parse --short HEAD) -X main.date=$(shell date +%s)" | ||||
| 		"-linkmode=external -s -w -X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" | ||||
| 
 | ||||
| cli-client: cli-deps-static-sites | ||||
| 	# This is a target to build the CLI (excluding the server) manually. This should work on Linux/macOS/Windows. | ||||
|  | @ -189,7 +190,7 @@ cli-client: cli-deps-static-sites | |||
| 		-o dist/ntfy_client/ntfy \
 | ||||
| 		-tags noserver \
 | ||||
| 		-ldflags \
 | ||||
| 		"-X main.version=$(VERSION) -X main.commit=$(shell git rev-parse --short HEAD) -X main.date=$(shell date +%s)" | ||||
| 		"-X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(shell date +%s)" | ||||
| 
 | ||||
| cli-deps: cli-deps-static-sites cli-deps-all cli-deps-gcc | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										15
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								README.md
									
										
									
									
									
								
							|  | @ -1,5 +1,13 @@ | |||
|  | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 👶 Baby break - My baby girl was born! | ||||
| Hey folks, my daughter was born on 8/30/22, so I'll be taking some time off from working on ntfy. I'll likely return  | ||||
| to working on features and bugs in a few weeks. I hope you understand. I posted some pictures in [#387](https://github.com/binwiederhier/ntfy/issues/387) 🥰    | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| # ntfy.sh | Send push notifications to your phone or desktop via PUT/POST | ||||
| [](https://github.com/binwiederhier/ntfy/releases/latest) | ||||
| [](https://pkg.go.dev/heckel.io/ntfy) | ||||
|  | @ -53,12 +61,17 @@ Or, if you'd like to help translate 🇩🇪 🇺🇸 🇧🇬, you can start im | |||
| <img src="https://hosted.weblate.org/widgets/ntfy/-/multi-blue.svg" alt="Translation status" /> | ||||
| </a> | ||||
| 
 | ||||
| ## Donations | ||||
| I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier).  | ||||
| I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much  | ||||
| appreciated. | ||||
| 
 | ||||
| ## License | ||||
| Made with ❤️ by [Philipp C. Heckel](https://heckel.io).    | ||||
| The project is dual licensed under the [Apache License 2.0](LICENSE) and the [GPLv2 License](LICENSE.GPLv2). | ||||
| 
 | ||||
| Third party libraries and resources: | ||||
| * [github.com/urfave/cli/v2](https://github.com/urfave/cli/v2) (MIT) is used to drive the CLI | ||||
| * [github.com/urfave/cli](https://github.com/urfave/cli) (MIT) is used to drive the CLI | ||||
| * [Mixkit sounds](https://mixkit.co/free-sound-effects/notification/) (Mixkit Free License) are used as notification sounds | ||||
| * [Sounds from notificationsounds.com](https://notificationsounds.com) (Creative Commons Attribution) are used as notification sounds | ||||
| * [Roboto Font](https://fonts.google.com/specimen/Roboto) (Apache 2.0) is used as a font in everything web | ||||
|  |  | |||
|  | @ -5,6 +5,12 @@ | |||
| # | ||||
| # default-host: https://ntfy.sh | ||||
| 
 | ||||
| # Defaults below will be used when a topic does not have its own settings | ||||
| # | ||||
| # default-user: | ||||
| # default-password: | ||||
| # default-command: | ||||
| 
 | ||||
| # Subscriptions to topics and their actions. This option is primarily used by the systemd service, | ||||
| # or if you cann "ntfy subscribe --from-config" directly. | ||||
| # | ||||
|  |  | |||
|  | @ -12,8 +12,11 @@ const ( | |||
| 
 | ||||
| // Config is the config struct for a Client | ||||
| type Config struct { | ||||
| 	DefaultHost string `yaml:"default-host"` | ||||
| 	Subscribe   []struct { | ||||
| 	DefaultHost     string `yaml:"default-host"` | ||||
| 	DefaultUser     string `yaml:"default-user"` | ||||
| 	DefaultPassword string `yaml:"default-password"` | ||||
| 	DefaultCommand  string `yaml:"default-command"` | ||||
| 	Subscribe       []struct { | ||||
| 		Topic    string            `yaml:"topic"` | ||||
| 		User     string            `yaml:"user"` | ||||
| 		Password string            `yaml:"password"` | ||||
|  | @ -25,8 +28,11 @@ type Config struct { | |||
| // NewConfig creates a new Config struct for a Client | ||||
| func NewConfig() *Config { | ||||
| 	return &Config{ | ||||
| 		DefaultHost: DefaultBaseURL, | ||||
| 		Subscribe:   nil, | ||||
| 		DefaultHost:     DefaultBaseURL, | ||||
| 		DefaultUser:     "", | ||||
| 		DefaultPassword: "", | ||||
| 		DefaultCommand:  "", | ||||
| 		Subscribe:       nil, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,6 +12,9 @@ func TestConfig_Load(t *testing.T) { | |||
| 	filename := filepath.Join(t.TempDir(), "client.yml") | ||||
| 	require.Nil(t, os.WriteFile(filename, []byte(` | ||||
| default-host: http://localhost | ||||
| default-user: phil | ||||
| default-password: mypass | ||||
| default-command: 'echo "Got the message: $message"' | ||||
| subscribe: | ||||
|   - topic: no-command-with-auth | ||||
|     user: phil | ||||
|  | @ -22,12 +25,16 @@ subscribe: | |||
|     command: notify-send -i /usr/share/ntfy/logo.png "Important" "$m" | ||||
|     if: | ||||
|             priority: high,urgent | ||||
|   - topic: defaults | ||||
| `), 0600)) | ||||
| 
 | ||||
| 	conf, err := client.LoadConfig(filename) | ||||
| 	require.Nil(t, err) | ||||
| 	require.Equal(t, "http://localhost", conf.DefaultHost) | ||||
| 	require.Equal(t, 3, len(conf.Subscribe)) | ||||
| 	require.Equal(t, "phil", conf.DefaultUser) | ||||
| 	require.Equal(t, "mypass", conf.DefaultPassword) | ||||
| 	require.Equal(t, `echo "Got the message: $message"`, conf.DefaultCommand) | ||||
| 	require.Equal(t, 4, len(conf.Subscribe)) | ||||
| 	require.Equal(t, "no-command-with-auth", conf.Subscribe[0].Topic) | ||||
| 	require.Equal(t, "", conf.Subscribe[0].Command) | ||||
| 	require.Equal(t, "phil", conf.Subscribe[0].User) | ||||
|  | @ -37,4 +44,5 @@ subscribe: | |||
| 	require.Equal(t, "alerts", conf.Subscribe[2].Topic) | ||||
| 	require.Equal(t, `notify-send -i /usr/share/ntfy/logo.png "Important" "$m"`, conf.Subscribe[2].Command) | ||||
| 	require.Equal(t, "high,urgent", conf.Subscribe[2].If["priority"]) | ||||
| 	require.Equal(t, "defaults", conf.Subscribe[3].Topic) | ||||
| } | ||||
|  |  | |||
|  | @ -1,8 +0,0 @@ | |||
| package cmd | ||||
| 
 | ||||
| import "syscall" | ||||
| 
 | ||||
| func processExists(pid int) bool { | ||||
| 	err := syscall.Kill(pid, syscall.Signal(0)) | ||||
| 	return err == nil | ||||
| } | ||||
|  | @ -1,3 +1,6 @@ | |||
| //go:build darwin || linux || dragonfly || freebsd || netbsd || openbsd | ||||
| // +build darwin linux dragonfly freebsd netbsd openbsd | ||||
| 
 | ||||
| package cmd | ||||
| 
 | ||||
| import "syscall" | ||||
|  | @ -175,11 +175,28 @@ func doSubscribe(c *cli.Context, cl *client.Client, conf *client.Config, topic, | |||
| 		for filter, value := range s.If { | ||||
| 			topicOptions = append(topicOptions, client.WithFilter(filter, value)) | ||||
| 		} | ||||
| 		if s.User != "" && s.Password != "" { | ||||
| 			topicOptions = append(topicOptions, client.WithBasicAuth(s.User, s.Password)) | ||||
| 		var user, password string | ||||
| 		if s.User != "" { | ||||
| 			user = s.User | ||||
| 		} else if conf.DefaultUser != "" { | ||||
| 			user = conf.DefaultUser | ||||
| 		} | ||||
| 		if s.Password != "" { | ||||
| 			password = s.Password | ||||
| 		} else if conf.DefaultPassword != "" { | ||||
| 			password = conf.DefaultPassword | ||||
| 		} | ||||
| 		if user != "" && password != "" { | ||||
| 			topicOptions = append(topicOptions, client.WithBasicAuth(user, password)) | ||||
| 		} | ||||
| 		subscriptionID := cl.Subscribe(s.Topic, topicOptions...) | ||||
| 		cmds[subscriptionID] = s.Command | ||||
| 		if s.Command != "" { | ||||
| 			cmds[subscriptionID] = s.Command | ||||
| 		} else if conf.DefaultCommand != "" { | ||||
| 			cmds[subscriptionID] = conf.DefaultCommand | ||||
| 		} else { | ||||
| 			cmds[subscriptionID] = "" | ||||
| 		} | ||||
| 	} | ||||
| 	if topic != "" { | ||||
| 		subscriptionID := cl.Subscribe(topic, options...) | ||||
|  |  | |||
|  | @ -1,3 +1,6 @@ | |||
| //go:build linux || dragonfly || freebsd || netbsd || openbsd | ||||
| // +build linux dragonfly freebsd netbsd openbsd | ||||
| 
 | ||||
| package cmd | ||||
| 
 | ||||
| const ( | ||||
|  | @ -449,6 +449,43 @@ You can now test the notifications and apply them to monitors: | |||
|     <a href="../static/img/uptimekuma-ios-up.jpg"><img src="../static/img/uptimekuma-ios-up.jpg"/></a> | ||||
| </div> | ||||
| 
 | ||||
| ## UptimeRobot | ||||
| Go to your [UptimeRobot](https://github.com/uptimerobot) My Settings > Alert Contacts > Add Alert Contact | ||||
| Select **Alert Contact Type** = Webhook. Then set your desired **Friendly Name** (e.g. "ntfy-sh-UP"), **URL to Notify**, **POST value** and select checkbox **Send as JSON (application/json)**. Make sure to send the JSON POST request to ntfy.domain.com without the topic name in the url and include the "topic" name in the JSON body. | ||||
| 
 | ||||
| <div id="uptimerobot-monitor-setup" class="screenshots"> | ||||
|     <a href="../static/img/uptimerobot-setup.jpg"><img src="../static/img/uptimerobot-setup.jpg"/></a> | ||||
| </div> | ||||
| 
 | ||||
| ``` json | ||||
| { | ||||
|     "topic":"myTopic", | ||||
|     "title": "*monitorFriendlyName* *alertTypeFriendlyName*", | ||||
|     "message": "*alertDetails*",  | ||||
|     "tags": ["green_circle"], | ||||
|     "priority": 3, | ||||
|     "click": https://uptimerobot.com/dashboard#*monitorID* | ||||
| } | ||||
| ``` | ||||
| You can create two Alert Contacts each with a different icon and priority, for example: | ||||
| 
 | ||||
| ``` json | ||||
| { | ||||
|     "topic":"myTopic", | ||||
|     "title": "*monitorFriendlyName* *alertTypeFriendlyName*", | ||||
|     "message": "*alertDetails*",  | ||||
|     "tags": ["red_circle"], | ||||
|     "priority": 3, | ||||
|     "click": https://uptimerobot.com/dashboard#*monitorID* | ||||
| } | ||||
| ``` | ||||
| You can now add the created Alerts Contact(s) to the monitor(s) and test the notifications: | ||||
| 
 | ||||
| <div id="uptimerobot-monitor-screenshots" class="screenshots"> | ||||
|     <a href="../static/img/uptimerobot-test.jpg"><img src="../static/img/uptimerobot-test.jpg"/></a> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| ## Apprise | ||||
| ntfy is integrated natively into [Apprise](https://github.com/caronc/apprise) (also check out the  | ||||
| [Apprise/ntfy wiki page](https://github.com/caronc/apprise/wiki/Notify_ntfy)). | ||||
|  |  | |||
|  | @ -44,8 +44,6 @@ server and listens for incoming notifications. This consumes additional battery | |||
| but delivers notifications instantly. | ||||
| 
 | ||||
| ## Where can I donate? | ||||
| Many people have asked (thanks for that!), but I am currently not accepting any donations. The cost is manageable  | ||||
| ($25/month for hosting, and $99/year for the Apple cert) right now, and I don't want to have to feel obligated to  | ||||
| anyone by accepting their money. | ||||
| 
 | ||||
| I may ask for donations in the future, though. After all, $400 per year isn't nothing...  | ||||
| I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier). | ||||
| I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much | ||||
| appreciated. | ||||
|  |  | |||
|  | @ -228,6 +228,11 @@ The server exposes its web UI and the API on port 80, so you need to expose that | |||
| [message cache](config.md#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings,  | ||||
| you should map `/etc/ntfy`, so you can edit `/etc/ntfy/server.yml`. | ||||
| 
 | ||||
| !!! info | ||||
|     Note that the Docker image **does not contain a `/etc/ntfy/server.yml` file**. If you'd like to use a config file,  | ||||
|     please manually create one outside the image and map it as a volume, e.g. via `-v /etc/ntfy:/etc/ntfy`. You may | ||||
|     use the [`server.yml` file on GitHub](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml) as a template. | ||||
| 
 | ||||
| Basic usage (no cache or additional config): | ||||
| ``` | ||||
| docker run -p 80:80 -it binwiederhier/ntfy serve | ||||
|  |  | |||
							
								
								
									
										98
									
								
								docs/integrations.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								docs/integrations.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | |||
| # Integrations + community projects | ||||
| 
 | ||||
| There are quite a few projects that work with ntfy, integrate ntfy, or have been built around ntfy. It's super exciting to see what you guys have come up with. Feel free to [create a pull request on GitHub](https://github.com/binwiederhier/ntfy/issues) to add your own project here. | ||||
| 
 | ||||
| I've added a ⭐ to projects or posts that have a significant following, or had a lot of interaction by the community. | ||||
| 
 | ||||
| ## Public ntfy servers | ||||
| 
 | ||||
| | URL                                           |  Country  | | ||||
| |-----------------------------------------------|:---------:| | ||||
| | [ntfy.sh](https://ntfy.sh/) (*Official*)      |   🇺🇸    | | ||||
| | [ntfy.tedomum.net](https://ntfy.tedomum.net/) | 🇫🇷 🇪🇺 | | ||||
| | [ntfy.jae.fi](https://ntfy.jae.fi/)           | 🇫🇮 🇪🇺 | | ||||
| 
 | ||||
| Thanks to everyone running a public server. **You guys rock!** To the users: Be aware that server operators can log your  | ||||
| messages until I finally finish implementing end-to-end encryption. | ||||
| 
 | ||||
| ## Official integrations | ||||
| 
 | ||||
| - [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy) ⭐ - Push Notifications that work with just about every platform | ||||
| - [Uptime Kuma](https://uptime.kuma.pet/) ⭐ - A self-hosted monitoring tool | ||||
| - [Robusta](https://docs.robusta.dev/master/catalog/sinks/webhook.html) ⭐ - open source platform for Kubernetes troubleshooting | ||||
| - [borgmatic](https://torsion.org/borgmatic/docs/how-to/monitor-your-backups/#third-party-monitoring-services) ⭐ - configuration-driven backup software for servers and workstations | ||||
| - [Radarr](https://radarr.video/) ⭐ - Movie collection manager for Usenet and BitTorrent users | ||||
| 
 | ||||
| ## [UnifiedPush](https://unifiedpush.org/users/apps/) integrations | ||||
| 
 | ||||
| - [Element](https://f-droid.org/packages/im.vector.app/) ⭐ - Matrix client | ||||
| - [SchildiChat](https://schildi.chat/android/) ⭐ - Matrix client | ||||
| - [Tusky](https://tusky.app/) ⭐ - Fediverse client | ||||
| - [Fedilab](https://fedilab.app/) - Fediverse client | ||||
| - [FindMyDevice](https://gitlab.com/Nulide/findmydevice/) - Find your Device with an SMS or online with the help of FMDServer | ||||
| - [Tox Push Message App](https://github.com/zoff99/tox_push_msg_app) - Tox Push Message App | ||||
| 
 | ||||
| ## Libraries  | ||||
| 
 | ||||
| - [ntfy-php-library](https://github.com/VerifiedJoseph/ntfy-php-library) - PHP library for sending messages using a ntfy server (PHP) | ||||
| - [ntfy-notifier](https://github.com/DAcodedBEAT/ntfy-notifier) - Symfony Notifier integration for ntfy (PHP) | ||||
| - [ntfpy](https://github.com/Nevalicjus/ntfpy) - API Wrapper for ntfy.sh (Python) | ||||
| - [pyntfy](https://github.com/DP44/pyntfy) - A module for interacting with ntfy notifications (Python) | ||||
| - [vntfy](https://github.com/lmangani/vntfy) - Barebone V client for ntfy (V) | ||||
| - [ntfy-middleman](https://github.com/nachotp/ntfy-middleman) - Wraps APIs and send notifications using ntfy.sh on schedule (Python) | ||||
| 
 | ||||
| ## CLIs + GUIs | ||||
| 
 | ||||
| - [ntfy.sh.sh](https://github.com/mininmobile/ntfy.sh.sh) - Run scripts on ntfy.sh events | ||||
| - [ntfy Desktop client](https://github.com/mininmobile/ntfy-desktop) - Cross-platform desktop application for ntfy | ||||
| - [ntfy svelte front-end](https://github.com/novatorem/Ntfy) - Front-end built with svelte | ||||
| - [wio-ntfy-ticker](https://github.com/nachotp/wio-ntfy-ticker) - Ticker display for a ntfy.sh topic | ||||
| - [ntfysh-windows](https://github.com/lucas-bortoli/ntfysh-windows) - A ntfy client for Windows Desktop | ||||
| - [ntfyr](https://github.com/haxwithaxe/ntfyr) - A simple commandline tool to send notifications to ntfy | ||||
| - [ntfy.py](https://github.com/ioqy/ntfy-client-python) - ntfy.py is a simple nfty.sh client for sending notifications | ||||
| 
 | ||||
| ## Projects + scripts  | ||||
| 
 | ||||
| - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) | ||||
| - [ntfy-long-zsh-command](https://github.com/robfox92/ntfy-long-zsh-command) - Notifies you once a long-running command completes (zsh) | ||||
| - [ntfy-shellscripts](https://github.com/nickexyz/ntfy-shellscripts) - A few scripts for the ntfy project (Shell) | ||||
| - [QuickStatus](https://github.com/corneliusroot/QuickStatus) - A shell script to alert to any immediate problems upon login (Shell) | ||||
| - [ntfy.el](https://github.com/shombando/ntfy) - Send notifications from Emacs (Emacs) | ||||
| - [backup-projects](https://gist.github.com/anthonyaxenov/826ba65abbabd5b00196bc3e6af76002) - Stupidly simple backup script for own projects (Shell) | ||||
| - [grav-plugin-whistleblower](https://github.com/Himmlisch-Studios/grav-plugin-whistleblower) - Grav CMS plugin to get notifications via ntfy (PHP) | ||||
| - [ntfy-server-status](https://github.com/filip2cz/ntfy-server-status) -  Checking if server is online and reporting through ntfy (C) | ||||
| - [borg-based backup](https://github.com/davidhi7/backup) - Simple borg-based backup script with notifications based on ntfy.sh or Discord webhooks (Python/Shell) | ||||
| - [ntfy.sh *arr script](https://github.com/agent-squirrel/nfty-arr-script) - Quick and hacky script to get sonarr/radarr to notify the ntfy.sh service (Shell) | ||||
| - [siteeagle](https://github.com/tpanum/siteeagle) - A small Python script to monitor websites and notify changes (Python) | ||||
| - [send_to_phone](https://github.com/whipped-cream/send_to_phone) - Scripts to upload a file to Transfer.sh and ping ntfy with the download link (Python) | ||||
| - [ntfy Discord bot](https://github.com/R0dn3yS/ntfy-bot) - WIP ntfy discord bot (TypeScript) | ||||
| - [ntfy Discord bot](https://github.com/binwiederhier/ntfy-bot) - ntfy Discord bot (Go) | ||||
| - [Bettarr Notifications](https://github.com/NiNiyas/Bettarr-Notifications) - Better Notifications for Sonarr and Radarr (Python) | ||||
| - [Notify me the intruders](https://github.com/nothingbutlucas/notify_me_the_intruders) - Notify you if they are intruders or new connections on your network (Shell) | ||||
| - [Send GitHub Action to ntfy](https://github.com/NiNiyas/ntfy-action) - Send GitHub Action workflow notifications to ntfy (JS) | ||||
| - [ntfy alertmanager bridge](https://github.com/aTable/ntfy_alertmanager_bridge) - Basic alertmanager bridge to ntfy (JS) | ||||
| - [restreamchat2ntfy](https://github.com/kurohuku7/restreamchat2ntfy) - Send restream.io chat to ntfy to check on the Meta Quest (JS) | ||||
| - [k8s-ntfy-deployment-service](https://github.com/Christian42/k8s-ntfy-deployment-service) - Automatic Kubernetes (k8s) ntfy deployment | ||||
| 
 | ||||
| ## Blog + forum posts | ||||
| 
 | ||||
| - [Self hosted Mobile Push Notifications using NTFY | Thejesh GN](https://thejeshgn.com/2022/08/23/self-hosted-mobile-push-notifications-using-ntfy/) - 8/2022 | ||||
| - [Fedora Magazine | 4 cool new projects to try in Copr](https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-august-2022/) - 8/2022 | ||||
| - [Docker로 오픈소스 푸시알람 프로젝트 ntfy.sh 설치 및 사용하기.(Feat. Uptimekuma)](https://svrforum.com/svr/398979) - 8/2022 | ||||
| - [Easy notifications from R](https://sometimesir.com/posts/easy-notifications-from-r/) - 6/2022 | ||||
| - [ntfy is finally coming to iOS, and Matrix/UnifiedPush gateway support](https://www.reddit.com/r/selfhosted/comments/vdzvxi/ntfy_is_finally_coming_to_ios_with_full/) ⭐ - 6/2022 | ||||
| - [无需注册的通知服务ntfy](https://wbsu2003.4everland.app/2022/05/30/%E6%97%A0%E9%9C%80%E6%B3%A8%E5%86%8C%E7%9A%84%E9%80%9A%E7%9F%A5%E6%9C%8D%E5%8A%A1ntfy/) - 5/2022 | ||||
| - [Install guide (with Docker)](https://chowdera.com/2022/150/202205301257379077.html) - 5/2022 | ||||
| - [Updated review post (Jan-Lukas Else)](https://jlelse.blog/thoughts/2022/04/ntfy) - 4/2022 | ||||
| - [Reddit feature update post](https://www.reddit.com/r/selfhosted/comments/uetlso/ntfy_is_a_tool_to_send_push_notifications_to_your/) ⭐ - 4/2022 | ||||
| - [無料で簡単に通知の送受信ができつつオープンソースでセルフホストも可能な「ntfy」を使ってみた (Gigazine)](https://gigazine.net/news/20220404-ntfy-push-notification/) - 4/2022 | ||||
| - [Pocketmags ntfy review](https://pocketmags.com/us/linux-format-magazine/march-2022/articles/1104187/ntfy) - 3/2022 | ||||
| - [Reddit web app release post](https://www.reddit.com/r/selfhosted/comments/tc0p0u/say_hello_to_the_brand_new_ntfysh_web_app_push/) ⭐ - 3/2022 | ||||
| - [Lemmy post (Jakob)](https://lemmy.eus/post/15541) - 1/2022 | ||||
| - [Reddit UnifiedPush release post](https://www.reddit.com/r/selfhosted/comments/s5jylf/my_open_source_notification_android_app_and/) ⭐ - 1/2022 | ||||
| - [ntfy: send notifications from your computer to your phone](https://rs1.es/tutorials/2022/01/19/ntfy-send-notifications-phone.html) - 1/2022 | ||||
| - [Short ntfy review (Jan-Lukas Else)](https://jlelse.blog/links/2021/12/ntfy-sh) - 12/2021 | ||||
| - [Free MacroDroid webhook alternative (FrameXX)](https://www.macrodroidforum.com/index.php?threads/ntfy-sh-free-macrodroid-webhook-alternative.1505/) - 12/2021 | ||||
| - [ntfy otro sistema de notificaciones pub-sub simple basado en HTTP](https://ugeek.github.io/blog/post/2021-11-05-ntfy-sh-otro-sistema-de-notificaciones-pub-sub-simple-basado-en-http.html) - 11/2021 | ||||
| - [Show HN: A tool to send push notifications to your phone, written in Go](https://news.ycombinator.com/item?id=29715464) ⭐ - 12/2021 | ||||
| - [Reddit selfhostable post](https://www.reddit.com/r/selfhosted/comments/qxlsm9/my_open_source_notification_android_app_and/) ⭐ - 11/2021 | ||||
|  | @ -1166,7 +1166,7 @@ Alternatively, the same actions can be defined as **JSON array**, if the notific | |||
|         method: 'POST', | ||||
|         body: JSON.stringify({ | ||||
|             topic: "myhome", | ||||
|             message": "You left the house. Turn down the A/C?", | ||||
|             message: "You left the house. Turn down the A/C?", | ||||
|             actions: [ | ||||
|                 { | ||||
|                     action: "view", | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release | |||
| 
 | ||||
| Thank you to [@wunter8](https://github.com/wunter8) for proactively picking up some Android tickets, and fixing them! You rock! | ||||
| 
 | ||||
| --> | ||||
| 
 | ||||
| ## ntfy server v1.28.0 (UNRELEASED) | ||||
| 
 | ||||
|  | @ -37,17 +38,23 @@ Thank you to [@wunter8](https://github.com/wunter8) for proactively picking up s | |||
| * Subscription display name for the web app ([#348](https://github.com/binwiederhier/ntfy/pull/348)) | ||||
| * Allow setting socket permissions via `--listen-unix-mode` ([#356](https://github.com/binwiederhier/ntfy/pull/356), thanks to [@koro666](https://github.com/koro666)) | ||||
| * Icons can be set for each individual notification ([#126](https://github.com/binwiederhier/ntfy/issues/126), thanks to [@wunter8](https://github.com/wunter8)) | ||||
| * CLI: Allow default username/password in `client.yml` ([#372](https://github.com/binwiederhier/ntfy/pull/372), thanks to [@wunter8](https://github.com/wunter8)) | ||||
| * Build support for other Unix systems ([#393](https://github.com/binwiederhier/ntfy/pull/393), thanks to [@la-ninpre](https://github.com/la-ninpre)) | ||||
| 
 | ||||
| **Bugs:** | ||||
| 
 | ||||
| * `ntfy user` commands don't work with `auth_file` but works with `auth-file` ([#344](https://github.com/binwiederhier/ntfy/issues/344), thanks to [@Histalek](https://github.com/Histalek) for reporting) | ||||
| * Ignore new draft HTTP `Priority` header  ([#351](https://github.com/binwiederhier/ntfy/issues/351), thanks to [@ksurl](https://github.com/ksurl) for reporting) | ||||
| * Delete expired attachments based on mod time instead of DB entry to avoid races (no ticket)  | ||||
| * Delete expired attachments based on mod time instead of DB entry to avoid races (no ticket) | ||||
| * Better logging for Matrix push key errors ([#384](https://github.com/binwiederhier/ntfy/pull/384), thanks to [@christophehenry](https://github.com/christophehenry)) | ||||
| 
 | ||||
| **Documentation:** | ||||
| 
 | ||||
| * Added [integrations + projects page](https://ntfy.sh/docs/integrations/) (**so many integrations, whoa!**) | ||||
| * Added example for [UptimeRobot](https://ntfy.sh/docs/examples/#uptimerobot) | ||||
| * Fix some PowerShell publish docs ([#345](https://github.com/binwiederhier/ntfy/pull/345), thanks to [@noahpeltier](https://github.com/noahpeltier)) | ||||
| 
 | ||||
| * Clarified Docker install instructions ([#361](https://github.com/binwiederhier/ntfy/issues/361), thanks to [@barart](https://github.com/barart) for reporting) | ||||
| * Mismatched quotation marks ([#392](https://github.com/binwiederhier/ntfy/pull/392)], thanks to [@connorlanigan](https://github.com/connorlanigan)) | ||||
| 
 | ||||
| ## ntfy server v1.27.2 | ||||
| Released June 23, 2022 | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								docs/static/img/uptimerobot-setup.jpg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/static/img/uptimerobot-setup.jpg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After   (image error) Size: 54 KiB | 
							
								
								
									
										
											BIN
										
									
								
								docs/static/img/uptimerobot-test.jpg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/static/img/uptimerobot-test.jpg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After   (image error) Size: 27 KiB | 
|  | @ -254,6 +254,14 @@ I hope this shows how powerful this command is. Here's a short video that demons | |||
|   <figcaption>Execute all the things</figcaption> | ||||
| </figure> | ||||
| 
 | ||||
| If most (or all) of your subscription usernames, passwords, and commands are the same, you can specify a `default-user`, `default-password`, and `default-command` at the top of the | ||||
| `client.yml`. If a subscription does not specify a username/password to use or does not have a command, the defaults will be used, otherwise, the subscription settings will | ||||
| override the defaults. | ||||
| 
 | ||||
| !!! warning | ||||
|     Because the `default-user` and `default-password` will be sent for each topic that does not have its own username/password (even if the topic does not require authentication), | ||||
|     be sure that the servers/topics you subscribe to use HTTPS to prevent leaking the username and password. | ||||
| 
 | ||||
| ### Using the systemd service | ||||
| You can use the `ntfy-client` systemd service (see [ntfy-client.service](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) | ||||
| to subscribe to multiple topics just like in the example above. The service is automatically installed (but not started) | ||||
|  |  | |||
							
								
								
									
										40
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								go.mod
									
										
									
									
									
								
							|  | @ -4,22 +4,22 @@ go 1.17 | |||
| 
 | ||||
| require ( | ||||
| 	cloud.google.com/go/firestore v1.6.1 // indirect | ||||
| 	cloud.google.com/go/storage v1.23.0 // indirect | ||||
| 	github.com/BurntSushi/toml v1.1.0 // indirect | ||||
| 	cloud.google.com/go/storage v1.26.0 // indirect | ||||
| 	github.com/BurntSushi/toml v1.2.0 // indirect | ||||
| 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect | ||||
| 	github.com/emersion/go-smtp v0.15.0 | ||||
| 	github.com/gabriel-vasile/mimetype v1.4.0 | ||||
| 	github.com/gabriel-vasile/mimetype v1.4.1 | ||||
| 	github.com/gorilla/websocket v1.5.0 | ||||
| 	github.com/mattn/go-sqlite3 v1.14.13 | ||||
| 	github.com/mattn/go-sqlite3 v1.14.15 | ||||
| 	github.com/olebedev/when v0.0.0-20211212231525-59bd4edcf9d6 | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	github.com/urfave/cli/v2 v2.10.2 | ||||
| 	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d | ||||
| 	golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect | ||||
| 	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f | ||||
| 	golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 | ||||
| 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 | ||||
| 	google.golang.org/api v0.85.0 | ||||
| 	github.com/urfave/cli/v2 v2.14.1 | ||||
| 	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 | ||||
| 	golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect | ||||
| 	golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde | ||||
| 	golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 | ||||
| 	golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 | ||||
| 	google.golang.org/api v0.94.0 | ||||
| 	gopkg.in/yaml.v2 v2.4.0 | ||||
| ) | ||||
| 
 | ||||
|  | @ -28,8 +28,8 @@ require github.com/pkg/errors v0.9.1 // indirect | |||
| require firebase.google.com/go/v4 v4.8.0 | ||||
| 
 | ||||
| require ( | ||||
| 	cloud.google.com/go v0.102.1 // indirect | ||||
| 	cloud.google.com/go/compute v1.7.0 // indirect | ||||
| 	cloud.google.com/go v0.104.0 // indirect | ||||
| 	cloud.google.com/go/compute v1.9.0 // indirect | ||||
| 	cloud.google.com/go/iam v0.3.0 // indirect | ||||
| 	github.com/AlekSi/pointer v1.2.0 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
|  | @ -39,20 +39,20 @@ require ( | |||
| 	github.com/google/go-cmp v0.5.8 // indirect | ||||
| 	github.com/google/uuid v1.3.0 // indirect | ||||
| 	github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect | ||||
| 	github.com/googleapis/gax-go/v2 v2.4.0 // indirect | ||||
| 	github.com/googleapis/gax-go/v2 v2.5.1 // indirect | ||||
| 	github.com/googleapis/go-type-adapters v1.0.0 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||
| 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect | ||||
| 	go.opencensus.io v0.23.0 // indirect | ||||
| 	golang.org/x/net v0.0.0-20220622184535-263ec571b305 // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664 // indirect | ||||
| 	golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect | ||||
| 	golang.org/x/text v0.3.7 // indirect | ||||
| 	golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect | ||||
| 	google.golang.org/appengine v1.6.7 // indirect | ||||
| 	google.golang.org/appengine/v2 v2.0.1 // indirect | ||||
| 	google.golang.org/genproto v0.0.0-20220623142657-077d458a5694 // indirect | ||||
| 	google.golang.org/grpc v1.47.0 // indirect | ||||
| 	google.golang.org/protobuf v1.28.0 // indirect | ||||
| 	google.golang.org/appengine/v2 v2.0.2 // indirect | ||||
| 	google.golang.org/genproto v0.0.0-20220902135211-223410557253 // indirect | ||||
| 	google.golang.org/grpc v1.49.0 // indirect | ||||
| 	google.golang.org/protobuf v1.28.1 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
|  |  | |||
							
								
								
									
										74
									
								
								go.sum
									
										
									
									
									
								
							
							
						
						
									
										74
									
								
								go.sum
									
										
									
									
									
								
							|  | @ -31,6 +31,10 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 | |||
| cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= | ||||
| cloud.google.com/go v0.102.1 h1:vpK6iQWv/2uUeFJth4/cBHsQAGjn1iIE6AAlxipRaA0= | ||||
| cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= | ||||
| cloud.google.com/go v0.103.0 h1:YXtxp9ymmZjlGzxV7VrYQ8aaQuAgcqxSy6YhDX4I458= | ||||
| cloud.google.com/go v0.103.0/go.mod h1:vwLx1nqLrzLX/fpwSMOXmFIqBOyHsvHbnAdbGSJ+mKk= | ||||
| cloud.google.com/go v0.104.0 h1:gSmWO7DY1vOm0MVU6DNXM11BWHHsTUmsC5cv1fuW5X8= | ||||
| cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= | ||||
| cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | ||||
| cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | ||||
| cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= | ||||
|  | @ -45,6 +49,10 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz | |||
| cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= | ||||
| cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= | ||||
| cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= | ||||
| cloud.google.com/go/compute v1.8.0 h1:NLtR56/eKx9K1s2Tw/4hec2vsU1S3WeKRMj8HXbBo6E= | ||||
| cloud.google.com/go/compute v1.8.0/go.mod h1:boQ44qJsMqZjKzzsEkoJWQGj4h8ygmyk17UArClWzmg= | ||||
| cloud.google.com/go/compute v1.9.0 h1:ED/FP4xv8GJw63v556/ASNc1CeeLUO2Bs8nzaHchkHg= | ||||
| cloud.google.com/go/compute v1.9.0/go.mod h1:lWv1h/zUWTm/LozzfTJhBSkd6ShQq8la8VeeuOEGxfY= | ||||
| cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | ||||
| cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= | ||||
| cloud.google.com/go/firestore v1.6.1 h1:8rBq3zRjnHx8UtBvaOWqBB1xq9jH6/wltfQLlTMh2Fw= | ||||
|  | @ -65,6 +73,10 @@ cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKu | |||
| cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= | ||||
| cloud.google.com/go/storage v1.23.0 h1:wWRIaDURQA8xxHguFCshYepGlrWIrbBnAmc7wfg07qY= | ||||
| cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= | ||||
| cloud.google.com/go/storage v1.25.0 h1:D2Dn0PslpK7Z3B2AvuUHyIC762bDbGJdlmQlCBR71os= | ||||
| cloud.google.com/go/storage v1.25.0/go.mod h1:Qys4JU+jeup3QnuKKAosWuxrD95C4MSqxfVDnSirDsI= | ||||
| cloud.google.com/go/storage v1.26.0 h1:lYAGjknyDJirSzfwUlkv4Nsnj7od7foxQNH/fqZqles= | ||||
| cloud.google.com/go/storage v1.26.0/go.mod h1:mk/N7YwIKEWyTvXAWQCIeiCTdLoRH6Pd5xmSnolQLTI= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | ||||
| firebase.google.com/go/v4 v4.8.0 h1:ooJqjFEh1G6DQ5+wyb/RAXAgku0E2RzJeH6WauSpWSo= | ||||
| firebase.google.com/go/v4 v4.8.0/go.mod h1:y+j6xX7BgBco/XaN+YExIBVm6pzvYutheDV3nprvbWc= | ||||
|  | @ -74,6 +86,8 @@ github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tS | |||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= | ||||
| github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= | ||||
| github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= | ||||
| github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= | ||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | ||||
| github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | ||||
| github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= | ||||
|  | @ -115,6 +129,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. | |||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||
| github.com/gabriel-vasile/mimetype v1.4.0 h1:Cn9dkdYsMIu56tGho+fqzh7XmvY2YyGU0FnbhiOsEro= | ||||
| github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= | ||||
| github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= | ||||
| github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | ||||
|  | @ -205,6 +221,8 @@ github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/Oth | |||
| github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= | ||||
| github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= | ||||
| github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= | ||||
| github.com/googleapis/gax-go/v2 v2.5.1 h1:kBRZU0PSuI7PspsSb/ChWoVResUcwNVIdpB049pKTiw= | ||||
| github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= | ||||
| github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= | ||||
| github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= | ||||
| github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= | ||||
|  | @ -224,6 +242,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3fk1I= | ||||
| github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||
| github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= | ||||
| github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= | ||||
| github.com/olebedev/when v0.0.0-20211212231525-59bd4edcf9d6 h1:oDSPaYiL2dbjcArLrFS8ANtwgJMyOLzvQCZon+XmFsk= | ||||
| github.com/olebedev/when v0.0.0-20211212231525-59bd4edcf9d6/go.mod h1:DPucAeQGDPUzYUt+NaWw6qsF5SFapWWToxEiVDh2aV0= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
|  | @ -246,6 +266,10 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc | |||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= | ||||
| github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= | ||||
| github.com/urfave/cli/v2 v2.11.2 h1:FVfNg4m3vbjbBpLYxW//WjxUoHvJ9TlppXcqY9Q9ZfA= | ||||
| github.com/urfave/cli/v2 v2.11.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= | ||||
| github.com/urfave/cli/v2 v2.14.1 h1:0Sx+C9404t2+DPuIJ3UpZFOEFhNG3wPxMj7uZHyZKFA= | ||||
| github.com/urfave/cli/v2 v2.14.1/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= | ||||
| github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= | ||||
| github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
|  | @ -269,6 +293,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U | |||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= | ||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= | ||||
| golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= | ||||
| golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | ||||
|  | @ -350,6 +378,12 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug | |||
| golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.0.0-20220622184535-263ec571b305 h1:dAgbJ2SP4jD6XYfMNLVj0BF21jo2PjChrtGaAvF5M3I= | ||||
| golang.org/x/net v0.0.0-20220622184535-263ec571b305/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= | ||||
| golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= | ||||
| golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= | ||||
| golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
|  | @ -373,6 +407,10 @@ golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j | |||
| golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= | ||||
| golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 h1:+jnHzr9VPj32ykQVai5DNahi9+NSp7yYuCsl5eAQtL0= | ||||
| golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= | ||||
| golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7 h1:dtndE8FcEta75/4kHF3AbpuWzV6f1LjnLrM4pe2SZrw= | ||||
| golang.org/x/oauth2 v0.0.0-20220808172628-8227340efae7/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= | ||||
| golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= | ||||
| golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
|  | @ -386,6 +424,10 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ | |||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= | ||||
| golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= | ||||
| golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
|  | @ -450,10 +492,19 @@ golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBc | |||
| golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664 h1:wEZYwx+kK+KlZ0hpvP2Ls1Xr4+RWnlzGFwPP0aiDjIU= | ||||
| golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2 h1:fqTvyMIIj+HRzMmnzr9NtpHP6uVpvB5fkHcgPDC4nu8= | ||||
| golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= | ||||
| golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= | ||||
| golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= | ||||
| golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= | ||||
| golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
|  | @ -469,6 +520,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb | |||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= | ||||
| golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ= | ||||
| golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||
|  | @ -574,6 +627,11 @@ google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3 | |||
| google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= | ||||
| google.golang.org/api v0.85.0 h1:8rJoHuRxx+vCmZtAO/3k1dRLvYNVyTJtZ5oaFZvhgvc= | ||||
| google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= | ||||
| google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= | ||||
| google.golang.org/api v0.93.0 h1:T2xt9gi0gHdxdnRkVQhT8mIvPaXKNsDNWz+L696M66M= | ||||
| google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= | ||||
| google.golang.org/api v0.94.0 h1:KtKM9ru3nzQioV1HLlUf1cR7vMYJIpgls5VhAYQXIwA= | ||||
| google.golang.org/api v0.94.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
|  | @ -584,6 +642,8 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6 | |||
| google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine/v2 v2.0.1 h1:jTGfiRmR5qoInpT3CXJ72GJEB4owDGEKN+xRDA6ekBY= | ||||
| google.golang.org/appengine/v2 v2.0.1/go.mod h1:XgltgQxPOF3ShivrVrZyfvYCx8Dunh73bKjUuXUZb8Q= | ||||
| google.golang.org/appengine/v2 v2.0.2 h1:MSqyWy2shDLwG7chbwBJ5uMyw6SNqJzhJHNDwYB0Akk= | ||||
| google.golang.org/appengine/v2 v2.0.2/go.mod h1:PkgRUWz4o1XOvbqtWTkBtCitEJ5Tp4HoVEdMMYQR/8E= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
|  | @ -673,6 +733,14 @@ google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljW | |||
| google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= | ||||
| google.golang.org/genproto v0.0.0-20220623142657-077d458a5694 h1:itnFmgk4Ls5nT+mYO2ZK6F0DpKsGZLhB5BB9y5ZL2HA= | ||||
| google.golang.org/genproto v0.0.0-20220623142657-077d458a5694/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= | ||||
| google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= | ||||
| google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= | ||||
| google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1 h1:C2UVWqrgLYKrT5nh5oU6hLRm1AeEklCK5eloQA1NtFY= | ||||
| google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= | ||||
| google.golang.org/genproto v0.0.0-20220819174105-e9f053255caa h1:Ux9yJCyf598uEniFPSyp8g1jtGTt77m+lzYyVgrWQaQ= | ||||
| google.golang.org/genproto v0.0.0-20220819174105-e9f053255caa/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= | ||||
| google.golang.org/genproto v0.0.0-20220902135211-223410557253 h1:vXJMM8Shg7TGaYxZsQ++A/FOSlbDmDtWhS/o+3w/hj4= | ||||
| google.golang.org/genproto v0.0.0-20220902135211-223410557253/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||
|  | @ -705,6 +773,10 @@ google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu | |||
| google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= | ||||
| google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= | ||||
| google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= | ||||
| google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= | ||||
| google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= | ||||
| google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= | ||||
| google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= | ||||
| google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= | ||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
|  | @ -721,6 +793,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ | |||
| google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= | ||||
| google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= | ||||
| google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
|  |  | |||
|  | @ -85,6 +85,7 @@ nav: | |||
| - "Other things": | ||||
|   - "FAQs": faq.md | ||||
|   - "Examples": examples.md | ||||
|   - "Integrations + projects": integrations.md | ||||
|   - "Release notes": releases.md | ||||
|   - "Deprecation notices": deprecations.md | ||||
|   - "Emojis 🥳 🎉": emojis.md | ||||
|  |  | |||
|  | @ -124,7 +124,7 @@ func newRequestFromMatrixJSON(r *http.Request, baseURL string, messageLimit int) | |||
| 	} | ||||
| 	pushKey := m.Notification.Devices[0].PushKey // We ignore other devices for now, see discussion in #316 | ||||
| 	if !strings.HasPrefix(pushKey, baseURL+"/") { | ||||
| 		return nil, &errMatrix{pushKey: pushKey, err: errHTTPBadRequestMatrixPushkeyBaseURLMismatch} | ||||
| 		return nil, &errMatrix{pushKey: pushKey, err: wrapErrHTTP(errHTTPBadRequestMatrixPushkeyBaseURLMismatch, "received push key: %s, configured base URL: %s", pushKey, baseURL)} | ||||
| 	} | ||||
| 	newRequest, err := http.NewRequest(http.MethodPost, pushKey, io.NopCloser(bytes.NewReader(body.PeekedBytes))) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ func TestMatrix_NewRequestFromMatrixJSON_MismatchingPushKey(t *testing.T) { | |||
| 	_, err := newRequestFromMatrixJSON(r, baseURL, maxLength) | ||||
| 	matrixErr, ok := err.(*errMatrix) | ||||
| 	require.True(t, ok) | ||||
| 	require.Equal(t, errHTTPBadRequestMatrixPushkeyBaseURLMismatch, matrixErr.err) | ||||
| 	require.Equal(t, "invalid request: push key must be prefixed with base URL, received push key: https://ntfy.example.com/upABCDEFGHI?up=1, configured base URL: https://ntfy.sh", matrixErr.err.Error()) | ||||
| 	require.Equal(t, "https://ntfy.example.com/upABCDEFGHI?up=1", matrixErr.pushKey) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										5783
									
								
								web/package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										5783
									
								
								web/package-lock.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -118,8 +118,8 @@ | |||
|     "prefs_notifications_min_priority_description_max": "仅显示最高优先级的通知", | ||||
|     "prefs_notifications_min_priority_any": "任意优先级", | ||||
|     "prefs_notifications_min_priority_low_and_higher": "低优先级和更高优先级", | ||||
|     "prefs_notifications_min_priority_default_and_higher": "默认优先级或更高优先级", | ||||
|     "prefs_notifications_min_priority_high_and_higher": "高优先级或更高优先级", | ||||
|     "prefs_notifications_min_priority_default_and_higher": "默认优先级和更高优先级", | ||||
|     "prefs_notifications_min_priority_high_and_higher": "高优先级和更高优先级", | ||||
|     "prefs_notifications_min_priority_max_only": "仅最高优先级", | ||||
|     "prefs_notifications_delete_after_never": "从不", | ||||
|     "prefs_notifications_delete_after_one_month": "一月后", | ||||
|  | @ -186,6 +186,6 @@ | |||
|     "prefs_users_edit_button": "编辑用户", | ||||
|     "publish_dialog_tags_placeholder": "英文逗号分隔标记列表,例如 warning, srv1-backup", | ||||
|     "publish_dialog_details_examples_description": "有关所有发送功能的示例和详细说明,请参阅<docsLink>文档</docsLink>。", | ||||
|     "subscribe_dialog_subscribe_description": "主题可能不受密码保护,因此请选择一个不容易猜测的名字。订阅后,您可以使用 PUT/POST 通知。", | ||||
|     "subscribe_dialog_subscribe_description": "主题可能不受密码保护,因此请选择一个不容易被猜中的名字。订阅后,您可以使用 PUT/POST 通知。", | ||||
|     "publish_dialog_delay_placeholder": "延期投递,例如 {{unixTimestamp}}、{{relativeTime}}或「{{naturalLanguage}}」(仅限英语)" | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Philipp Heckel
						Philipp Heckel