1
0
mirror of https://github.com/kha7iq/pingme.git synced 2025-05-16 06:40:12 -07:00

Compare commits

..

No commits in common. "master" and "v0.2.1" have entirely different histories.

27 changed files with 292 additions and 1878 deletions

35
.github/ISSUE_TEMPLATE/bug_report.md-e vendored Normal file
View File

@ -0,0 +1,35 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

31
.github/PULL_REQUEST_TEMPLATE.md-e vendored Normal file
View File

@ -0,0 +1,31 @@
# Description
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
Fixes # (issue)
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
# How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
- [ ] Running existing tests
- [ ] Created new tests
# Checklist:
- [ ] My code has been linted (`make lint`)
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] I have rebased my branch to include the latest changes from `master`

View File

@ -1,23 +0,0 @@
pkgbase = pingme-bin
pkgdesc = PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email (official binary)
pkgver = ${PKGVER}
pkgrel = ${PKGREL}
url = https://pingme.lmno.pk
arch = i686
arch = x86_64
arch = aarch64
license = MIT
optdepends = nfpm: deb and rpm packager
provides = ${_PKGNAME}
conflicts = ${_PKGNAME}
source_x86_64 = ${_PKGNAME}_${pkgver}_linux_x86_64.tar.gz::https://github.com/kha7iq/${_PKGNAME}/releases/download/v${pkgver}/${_PKGNAME}_linux_x86_64.tar.gz")
sha256sums_x86_64 = (${SHA256SUM_X86})
source_i686 = ${_PKGNAME}_${pkgver}_linux_i386.tar.gz::https://github.com/kha7iq/${_PKGNAME}/releases/download/v${pkgver}/${_PKGNAME}_linux_i386.tar.gz")
sha256sums_i686 = (${SHA256SUM_i686})
source_aarch64 = ${_PKGNAME}_${pkgver}_linux_arm64.tar.gz::https://github.com/kha7iq/${_PKGNAME}/releases/download/v${pkgver}/${_PKGNAME}_linux_arm64.tar.gz")
sha256sums_aarch64 = (${SHA256SUM_AARCH64})
pkgname = pingme-bin

View File

@ -1,34 +0,0 @@
# Maintainer: Abdul Khaliq <a.khaliq@outlook.my>
pkgname='pingme-bin'
_pkgname="${pkgname%-bin}"
pkgver=${PKGVER}
pkgrel=${PKGREL}
pkgdesc="PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email. (official binary)"
url='https://pingme.lmno.pk'
arch=("i686" "x86_64" "aarch64")
license=("MIT")
provides=("${_pkgname}")
conflicts=("${_pkgname}")
depends=()
makedepends=()
optdepends=('nfpm: deb and rpm packager')
_basedownloadurl="https://github.com/kha7iq/${_pkgname}/releases/download/v${pkgver}"
source_x86_64=("${_pkgname}_${pkgver}_linux_x86_64.tar.gz::${_basedownloadurl}/${_pkgname}_linux_x86_64.tar.gz")
sha256sums_x86_64=(${SHA256SUM_X86})
source_i686=("${_pkgname}_${pkgver}_linux_i386.tar.gz::${_basedownloadurl}/${_pkgname}_linux_i386.tar.gz")
sha256sums_i686=(${SHA256SUM_i686})
source_aarch64=("${_pkgname}_${pkgver}_linux_arm64.tar.gz::${_basedownloadurl}/${_pkgname}_linux_arm64.tar.gz")
sha256sums_aarch64=(${SHA256SUM_AARCH64})
package() {
# Bin
rm -f "${pkgdir}/usr/bin/${_pkgname}"
install -Dm755 "${srcdir}/${_pkgname}" "${pkgdir}/usr/bin/${_pkgname}"
}

View File

@ -1,64 +0,0 @@
#!/usr/bin/env bash
set -e
WD=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)
PKGNAME=$(basename $WD)
repo="kha7iq/pingme"
export _PKGNAME="${PKGNAME%-bin}"
ROOT=${WD%/.github/aur/$PKGNAME}
LOCKFILE=/tmp/aur-$PKGNAME.lock
exec 100>$LOCKFILE || exit 0
flock -n 100 || exit 0
trap "rm -f $LOCKFILE" EXIT
export PKGVER=$(curl -s https://api.github.com/repos/$repo/releases/latest | grep -o '"tag_name": "v[^"]*' | cut -d'"' -f4 | sed 's/^v//')
echo "Publishing to AUR as version ${PKGVER}"
cd $WD
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
if [ -z "$AUR_SSH_PRIVATE_KEY" ]
then
echo "\$AUR_SSH_PRIVATE_KEY is not set"
else
eval $(ssh-agent -s)
ssh-add <(echo "$AUR_SSH_PRIVATE_KEY")
fi
GITDIR=$(mktemp -d /tmp/aur-$PKGNAME-XXX)
trap "rm -rf $GITDIR" EXIT
git clone aur@aur.archlinux.org:$PKGNAME $GITDIR 2>&1
CURRENT_PKGVER=$(cat $GITDIR/.SRCINFO | grep pkgver | awk '{ print $3 }')
CURRENT_PKGREL=$(cat $GITDIR/.SRCINFO | grep pkgrel | awk '{ print $3 }')
if [[ "${CURRENT_PKGVER}" == "${PKGVER}" ]]; then
export PKGREL=$((CURRENT_PKGREL+1))
else
export PKGREL=1
fi
export SHA256SUM_X86=$(curl -sL https://github.com/kha7iq/${_PKGNAME}/releases/download/v${PKGVER}/${_PKGNAME}_linux_x86_64.tar.gz | sha256sum | awk '{ print $1 }')
export SHA256SUM_i686=$(curl -sL https://github.com/kha7iq/${_PKGNAME}/releases/download/v${PKGVER}/${_PKGNAME}_linux_i386.tar.gz | sha256sum | awk '{ print $1 }')
export SHA256SUM_AARCH64=$(curl -sL https://github.com/kha7iq/$_PKGNAME/releases/download/v${PKGVER}/${_PKGNAME}_linux_arm64.tar.gz | sha256sum | awk '{ print $1 }')
envsubst '$PKGVER $PKGREL $_PKGNAME $SHA256SUM_X86 $SHA256SUM_i686 $SHA256SUM_AARCH64' < .SRCINFO.template > $GITDIR/.SRCINFO
envsubst '$PKGVER $PKGREL $SHA256SUM_X86 $SHA256SUM_i686 $SHA256SUM_AARCH64' < PKGBUILD.template > $GITDIR/PKGBUILD
cd $GITDIR
git config user.name "kha7iq"
git config user.email "a.khaliq@outlook.my"
git add -A
if [ -z "$(git status --porcelain)" ]; then
echo "No changes."
else
git commit -m "Updated to version v${PKGVER} release ${PKGREL}"
git push origin master
fi

View File

@ -1,13 +0,0 @@
pkgbase = pingme
pkgdesc = PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email
pkgver = ${PKGVER}
pkgrel = ${PKGREL}
url = https://pingme.lmno.pk
arch = i686
arch = x86_64
arch = aarch64
license = MIT
makedepends = go
source = pingme-${pkgver}.tar.gz::https://github.com/kha7iq/${pkgname}/archive/v${pkgver}.tar.gz
pkgname = pingme

View File

@ -1,27 +0,0 @@
# Maintainer: André Kugland <kugland@gmail.com>
pkgname=pingme
pkgver=${PKGVER}
pkgrel=${PKGREL}
pkgdesc="PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email."
url='https://pingme.lmno.pk'
arch=("i686" "x86_64" "aarch64")
license=("MIT")
makedepends=('go>=1.16')
source=(
"${pkgname}-${pkgver}.tar.gz::https://github.com/kha7iq/${pkgname}/archive/v${pkgver}.tar.gz"
)
sha256sums=(
${SHA256SUM}
)
build() {
cd "${pkgname}-${pkgver}"
export CGO_LDFLAGS="$LDFLAGS"
go build -ldflags "-linkmode=external -s -w -X main.Version=${pkgver}" -o ${pkgname} .
}
package() {
cd "${pkgname}-${pkgver}"
install -Dm755 ${pkgname} "${pkgdir}/usr/bin/${pkgname}"
}

View File

@ -1,61 +0,0 @@
#!/usr/bin/env bash
set -e
WD=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)
PKGNAME=$(basename $WD)
ROOT=${WD%/.github/aur/$PKGNAME}
repo="kha7iq/pingme"
LOCKFILE=/tmp/aur-$PKGNAME.lock
exec 100>$LOCKFILE || exit 0
flock -n 100 || exit 0
trap "rm -f $LOCKFILE" EXIT
export PKGVER=$(curl -s https://api.github.com/repos/$repo/releases/latest | grep -o '"tag_name": "v[^"]*' | cut -d'"' -f4 | sed 's/^v//')
echo "Publishing to AUR as version ${PKGVER}"
cd $WD
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
if [ -z "$AUR_SSH_PRIVATE_KEY" ]
then
echo "\$AUR_SSH_PRIVATE_KEY is not set"
else
eval $(ssh-agent -s)
ssh-add <(echo "$AUR_SSH_PRIVATE_KEY")
fi
GITDIR=$(mktemp -d /tmp/aur-$PKGNAME-XXX)
trap "rm -rf $GITDIR" EXIT
git clone aur@aur.archlinux.org:$PKGNAME $GITDIR 2>&1
CURRENT_PKGVER=$(cat $GITDIR/.SRCINFO | grep pkgver | awk '{ print $3 }')
CURRENT_PKGREL=$(cat $GITDIR/.SRCINFO | grep pkgrel | awk '{ print $3 }')
if [[ "${CURRENT_PKGVER}" == "${PKGVER}" ]]; then
export PKGREL=$((CURRENT_PKGREL+1))
else
export PKGREL=1
fi
export SHA256SUM=$(curl -sL https://github.com/kha7iq/${PKGNAME}/archive/v$PKGVER.tar.gz | sha256sum | awk '{ print $1 }')
envsubst '$PKGVER $PKGREL $SHA256SUM' < .SRCINFO.template > $GITDIR/.SRCINFO
envsubst '$PKGVER $PKGREL $SHA256SUM' < PKGBUILD.template > $GITDIR/PKGBUILD
cd $GITDIR
git config user.name "kha7iq"
git config user.email "a.khaliq@outlook.my"
git add -A
if [ -z "$(git status --porcelain)" ]; then
echo "No changes."
else
git commit -m "Updated to version v${PKGVER} release ${PKGREL}"
git push origin master
fi

View File

@ -2,8 +2,12 @@ name: build
on:
push:
# branches:
# - 'master'
# paths-ignore:
# - '**.md'
tags:
- 'v0.[0-9]+.[0-9]'
- 'v*.*.*'
jobs:
release-pingme:
@ -11,56 +15,72 @@ jobs:
env:
DOCKER_CLI_EXPERIMENTAL: "enabled"
steps:
- name: Checkout
uses: actions/checkout@v4
-
name: Checkout
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v4
-
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '>=1.20.0'
- name: Docker login GHCR
go-version: '1.16'
-
name: Cache Go modules
uses: actions/cache@v2.1.5
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
-
name: Diff
run: git diff
-
name: Docker login GHCR
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker Login DockerHub
-
name: Docker Login DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Release PingMe
uses: goreleaser/goreleaser-action@v3
-
name: Release PingMe
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --clean
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
- name: Notify on failure
-
name: Notify on failure
uses: kha7iq/pingme-action@v1
if: failure()
env:
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
TELEGRAM_CHANNELS: ${{ secrets.TELEGRAM_CHANNELS }}
TELEGRAM_TITLE: '🟢 New Release: ${{ github.ref }}'
TELEGRAM_MESSAGE: 'Event is triggered by ${{ github.event_name }} ❌ ${{ job.status }}'
TELEGRAM_MESSAGE: 'Event is triggerd by ${{ github.event_name }} ❌ ${{ job.status }}'
with:
service: telegram
service: pushover
- name: Notify on success
-
name: Notify on success
uses: kha7iq/pingme-action@v1
if: success()
env:
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
TELEGRAM_CHANNELS: ${{ secrets.TELEGRAM_CHANNELS }}
TELEGRAM_TITLE: '🟢 New Release: ${{ github.ref }}'
TELEGRAM_MESSAGE: 'Event is triggered by ${{ github.event_name }} ✅ ${{ job.status }}'
TELEGRAM_MESSAGE: 'Event is triggerd by ${{ github.event_name }} ✅ ${{ job.status }}'
with:
service: telegram

14
.github/workflows/pull_request.yml vendored Normal file
View File

@ -0,0 +1,14 @@
on: pull_request
jobs:
lint-code:
runs-on: ubuntu-latest
name: Perform Checks
steps:
- name: Checkout
uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.29

View File

@ -12,15 +12,10 @@ builds:
- darwin
- windows
goarch:
- "386"
- 386
- amd64
- arm
- arm64
goarm:
- "7"
ignore:
- goos: windows
goarch: arm64
mod_timestamp: '{{ .CommitTimestamp }}'
flags:
- -trimpath
@ -35,21 +30,19 @@ changelog:
exclude: ['^docs:', '^test:', 'Merge pull request', 'Merge branch', 'go mod tidy']
archives:
- name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
- name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
format_overrides:
- goos: windows
format: zip
files:
- README.md
- LICENSE.md
brews:
- repository:
- tap:
owner: kha7iq
name: homebrew-tap
folder: Formula
@ -63,7 +56,6 @@ brews:
nfpms:
- file_name_template: '{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
maintainer: 'Abdul Khaliq <a.khaliq@outlook.my>'
homepage: pingme.lmno.pk
description: PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms.
license: MIT
@ -73,11 +65,21 @@ nfpms:
dependencies:
- git
scoops:
- repository:
# snapcrafts:
# - name_template: '{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
# summary: PingMe is a CLI tool which provides the ability to send messages
# description: |
# PingMe is a CLI tool which provides the ability to send messages
# or alerts to multiple messaging platforms.
# grade: stable
# confinement: strict
# publish: false
scoop:
url_template: "https://github.com/kha7iq/pingme/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
bucket:
owner: kha7iq
name: scoop-bucket
url_template: "https://github.com/kha7iq/pingme/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
homepage: https://pingme.lmno.pk
description: PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms.
license: MIT

View File

@ -12,6 +12,8 @@
<img alt="Release" src="https://img.shields.io/github/v/release/kha7iq/pingme">
<a href="https://goreportcard.com/report/github.com/kha7iq/pingme">
<img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/kha7iq/pingme">
<a href="#">
<img alt="Build" src="https://img.shields.io/github/workflow/status/kha7iq/pingme/goreleaser">
<a href="https://github.com/kha7iq/pingme/issues">
<img alt="GitHub issues" src="https://img.shields.io/github/issues/kha7iq/pingme?style=flat-square&logo=github&logoColor=white">
<a href="https://github.com/kha7iq/pingme/blob/master/LICENSE.md">
@ -29,6 +31,7 @@
<a href="#github-action">Github Action</a>
<a href="#configuration">Configuration</a>
<a href="#contributing">Contributing</a>
<a href="#show-your-support">Show Your Support</a>
</p>
---
@ -38,7 +41,7 @@
**PingMe** is a personal project to satisfy my needs of having alerts, most
major platforms have integration to send alerts but its not always useful,
either you are stuck with one particular platform, or you have to do alot of
integrations. I needed a small utility which i can just call from my backup scripts,
integrations. I needed a small app which i can just call from my backup scripts,
cron jobs, CI/CD pipelines or from anywhere to send a message with particular
information. And i can ship it everywhere with ease. Hence, the birth of PingMe.
@ -51,7 +54,6 @@ platforms.
- *Discord*
- *Email*
- *Gotify*
- *Line*
- *Mastodon*
- *Mattermost*
@ -61,10 +63,8 @@ platforms.
- *RocketChat*
- *Slack*
- *Telegram*
- *Textmagic*
- *Twillio*
- *Zulip*
- *Wechat*
## Install
@ -74,44 +74,20 @@ platforms.
brew install kha7iq/tap/pingme
```
## Linux Binary
## Shell Script
By default pingme is going to be installed at `/usr/bin/` sudo is requried for this operation.
If you would like to provide a custom install path you can do so as input to script. i.e `./install.sh $HOME/bin`
```bash
curl -s https://raw.githubusercontent.com/kha7iq/pingme/master/install.sh | sudo sh
```
or
```bash
curl -sL https://bit.ly/installpm | sudo sh
```
## Linux
* AUR
```bash
# build from sources
yay -S pingme
# binary
yay -S pingme-bin
```
## Manual
```bash
# Chose desired version, architecture & target os
export PINGME_VERSION="0.2.6"
export ARCH="x86_64"
export OS="Linux"
wget -q https://github.com/kha7iq/pingme/releases/download/v${PINGME_VERSION}/pingme_${OS}_${ARCH}.tar.gz && \
tar -xf pingme_${OS}_${ARCH}.tar.gz && \
chmod +x pingme && \
wget -q https://github.com/kha7iq/pingme/releases/download/v0.1.6/pingme_Linux_x86_64.tar.gz
tar -xf pingme_Linux_x86_64.tar.gz
chmod +x pingme
sudo mv pingme /usr/local/bin/pingme
```
### Go Get
```bash
go get -u github.com/kha7iq/pingme
```
### Windows
@ -121,13 +97,13 @@ scoop install pingme
```
Alternatively you can head over to [release pages](https://github.com/kha7iq/pingme/releases)
and download `deb`, `rpm` or `binary` for windows & all other supported platforms.
and download the binary for windows & all other supported platforms.
### Docker
Docker container is also available on both dockerhub and github container registry.
`latest` tag will always pull the latest version available, or you can also download
`latest` tage will always pull the latest version avaialbe, you can also download
specific version. Checkout [release](https://github.com/kha7iq/pingme/releases)
page for available versions.
@ -151,14 +127,16 @@ docker run ghcr.io/kha7iq/pingme:latest
## Github Action
A github action is available for integration with your workflows, you can find it on
A github action is also available now for this app, you can find it on
[Github Market Place](https://github.com/marketplace/actions/pingme-action) or
here [Github Repo](https://github.com/kha7iq/pingme-action).
from this [repository](https://github.com/kha7iq/pingme-action) on github.
```yaml
- name: PingMe-Action
uses: kha7iq/pingme-action@v1
```
Usage examples for workflow are available in the repo.
## Usage
```bash
@ -174,8 +152,7 @@ DESCRIPTION:
PingMe is a CLI tool which provides the ability to send messages or alerts to multiple
messaging platforms and also email, everything is configurable via environment
variables and command line switches.Currently supported platforms include Slack, Telegram,
RocketChat, Discord, Pushover, Mattermost, Pushbullet, Microsoft Teams, Twillio, Mastodon,
email address, Line, Gotify and Wechat.
RocketChat, Discord, Pushover, Mattermost, Pushbullet, Microsoft Teams, Twillio, Mastodon and email address.
COMMANDS:
telegram Send message to telegram
@ -191,8 +168,6 @@ COMMANDS:
zulip Send message to zulip
mastodon Set status message for mastodon
line Send message to line messenger
wechat Send message to wechat official account
gotify Send push notification to gotify server
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
@ -215,6 +190,10 @@ Contributions, issues and feature requests are welcome!<br/>Feel free to check
[issues page](https://github.com/kha7iq/pingme/issues). You can also take a look
at the [contributing guide](https://github.com/kha7iq/pingme/blob/master/CONTRIBUTING.md).
## Show your support
Give a ⭐️ if you like this project!
## Acknowledgments
This project is based on amazing library [Notify](https://github.com/nikoksr/notify)
This project is based on amazing library [Notify](https://github.com/nikoksr/notify)

View File

@ -14,7 +14,6 @@ possible.
- `service/telegram` - Telegram notification service.
- `service/pushover` - Pushover Notification service.
- `service/line` - Line notification service.
- `service/wechat` - Wechat Official Account notification service.
### Documentation

View File

@ -50,21 +50,15 @@ platforms.
- *Discord*
- *Email*
- *Gotify*
- *Line*
- *Mastodon*
- *Mattermost*
- *Matrix*
- *Microsoft Teams*
- *Pushbullet*
- *Mattermost*
- *Pushover*
- *Pushbullet*
- *RocketChat*
- *Slack*
- *Telegram*
- *Textmagic*
- *Twillio*
- *Zulip*
- *Wechat*
- *Line Messenger*
## Demo

View File

@ -6,6 +6,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/npm/docsify-darklight-theme@latest/dist/style.min.css"
@ -18,31 +19,11 @@
<script>
window.$docsify = {
homepage: 'home.md',
siteFont : 'Source Sans Pro',
defaultTheme : 'light | dark',
codeFontFamily : 'monospace',
logo: '/_media/logo.png',
loadSidebar: true,
subMaxLevel: 2,
name: 'PingMe',
repo: 'https://github.com/kha7iq/pingme',
darklightTheme: {
siteFont : 'PT Sans',
defaultTheme : 'dark | light',
codeFontFamily : 'Roboto Mono, Monaco, courier, monospace',
bodyFontSize : '16px',
dark: {
accent: '#ffa500',
background: '#282C34',
codeTextColor : '#b4b4b4',
codeBackgroundColor : '#353A44',
coverBackground : '#161B22'
},
light: {
accent: '#008080',
coverBackground : '#f0f0f0'
}
}
repo: 'https://github.com/kha7iq/pingme'
}
</script>
<!-- Docsify v4 -->
@ -51,7 +32,5 @@
src="//cdn.jsdelivr.net/npm/docsify-darklight-theme@latest/dist/index.min.js"
type="text/javascript">
</script>
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-yaml.min.js "></script>
</body>
</html>

View File

@ -6,37 +6,21 @@
brew install kha7iq/tap/pingme
```
## Shell Script
By default pingme is going to be installed at `/usr/bin/` sudo is requried for this operation.
## Linux Binary
If you would like to provide a custom install path you can do so as input to script. i.e `./install.sh $HOME/bin`
```bash
curl -s https://raw.githubusercontent.com/kha7iq/pingme/master/install.sh | sudo sh
```
or
```bash
curl -sL https://bit.ly/installpm | sudo sh
```
## Linux
* AUR
```bash
yay -S pingme-bin
```
## Manual
```bash
# Chose desired version, architecture & target os
export PINGME_VERSION="0.2.4"
export ARCH="x86_64"
export OS="Linux"
wget -q https://github.com/kha7iq/pingme/releases/download/v${PINGME_VERSION}/pingme_${OS}_${ARCH}.tar.gz && \
tar -xf pingme_${OS}_${ARCH}.tar.gz && \
chmod +x pingme && \
wget -q https://github.com/kha7iq/pingme/releases/download/v0.1.6/pingme_Linux_x86_64.tar.gz
tar -xf pingme_Linux_x86_64.tar.gz
chmod +x pingme
sudo mv pingme /usr/local/bin/pingme
```
## Go Get
```bash
go get -u github.com/kha7iq/pingme
```
## Windows
```powershell

View File

@ -1,8 +1,8 @@
# Configuration
All the flags have corresponding environment variables associated with them. You
All the flags have corresponding environment variables assosiated with it. You
can either provide the value with flags or export to a variable. You can view
the corresponding variable with `--help` flag.
the corresponding variable to each with --help flag.
*Flags* take precedence over *variables*
@ -14,10 +14,7 @@ Telegram uses bot token to authenticate & send messages to defined channels.
Multiple channel IDs can be used separated by comma ','.
```bash
pingme telegram \
--token "0125:AAFHvnYf_ABC" \
--msg "This is a new message ✈" \
--channel="-1001001001,-1002002001"
pingme telegram --token "0125:AAFHvnYf_ABC" --msg "This is a new message ✈" --channel="-1001001001,-1002002001"
```
- GitHub Action
@ -51,60 +48,11 @@ jobs:
| Variables | Default Value |
| -------------------------- | :----------------: |
| TELEGRAM_TITLE | "" |
| TELEGRAM_MSG_TITLE | "" |
| TELEGRAM_TOKEN | "" |
| TELEGRAM_CHANNELS | "" |
| TELEGRAM_MESSAGE | "" |
## Gotify
With gotify you can send push messages to any instance of Gotify server.
```bash
pingme gotify \
--url 'https://example.com' \
--token 'tokenabc' \
--title 'some title' \
--msg 'some message' \
--priority 5
```
- GitHub Action
```yaml
on: [push]
jobs:
pingme-job:
runs-on: ubuntu-latest
name: PingMe
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Ping me On
uses: kha7iq/pingme-action@v1
env:
GOTIFY_TOKEN: ${{ secrets.GOTIFY_TOKEN }}
GOTIFY_URL: "example.com"
GOTIFY_TITLE: 'Reference: ${{ github.ref }}'
GOTIFY_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with:
# Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email
service: gotify
```
- **Variables**
| Variables | Default Value |
| -------------------------- | :----------------: |
| GOTIFY_URL | "" |
| GOTIFY_TOKEN | "" |
| GOTIFY_PRIORITY | "5" |
| GOTIFY_MESSAGE | "" |
| GOTIFY_TITLE | "Server Time" |
| TELEGRAM_MSG_TITLE | "" |
## RocketChat
@ -248,6 +196,7 @@ jobs:
MATTERMOST_TOKEN: ${{ secrets.MATTERMOST_TOKEN }}
MATTERMOST_SERVER_URL: ${{ secrets.MATTERMOST_SERVER_URL }}
MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }}
MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }}
MATTERMOST_TITLE: 'Reference: ${{ github.ref }}'
MATTERMOST_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with:
@ -323,10 +272,7 @@ Discord uses bot token to authenticate & send messages to defined channels.
Multiple channel IDs can be used separated by comma ','.
```bash
pingme discord \
--token '123' \
--channel '1234567890' \
--msg 'some message'
pingme discord --token '123' --channel '1234567890' --msg 'some message'
```
- GitHub Action
@ -372,10 +318,8 @@ Teams uses webhooks to send messages, you can add multiple webhooks separated
by comma ',' or you can add permissions for multiple channels to single webhook.
```bash
pingme teams \
--webhook 'https://example.webhook.office.com/xx' \
--msg 'some message'
```
pingme teams --webhook 'https://example.webhook.office.com/xx' --msg 'some message'
```
- GitHub Action
@ -420,7 +364,7 @@ jobs:
pingme pushbullet \
--sms true \
--token "abcdefg" \
-d "android" \
-d "adnroid" \
--msg "some message" \
--number "00123456789"
```
@ -428,7 +372,7 @@ pingme pushbullet \
- Push notification
```bash
pingme pushbullet --token "abcdefg" -d "android" --msg "some message"
pingme pushbullet --token "abcdefg" -d "adnroid" --msg "some message"
```
- GitHub Action
@ -572,7 +516,7 @@ Zulip uses bot email and token for authentication, and sends messages to particu
```bash
pingme zulip
--email 'john.doe@email.com' \
--email 'john.doe@email.com' \
--api-key '12345567' \
--to 'london' \
--type 'stream' \
@ -699,179 +643,3 @@ pingme email \
| EMAIL_PORT | "587" |
| EMAIL_MESSAGE | "" |
| EMAIL_SUBJECT | "" |
## Wechat Official Account
Wechat uses appid, appsecret, chatbot server token and encoding AES key for authentication, and sends messages.
```bash
pingme wechat
--appid "xxxxxxxx" \
--appsecret 'xxxxxxxxxx' \
--token 'xxxxxxxxxx' \
--aes 'IGNORED-IN-SANDBOX' \
--msg 'content of message' \
--receivers 'some receivers'
```
- GitHub Action
```yaml
on: [push]
jobs:
pingme-job:
runs-on: ubuntu-latest
name: PingMe
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Ping me On
uses: kha7iq/pingme-action@v1
env:
WECHAT_APPID: ${{ secrets.WECHAT_APPID }}
WECHAT_APPSECRET: ${{ secrets.WECHAT_APPSECRET }}
WECHAT_TOKEN: ${{ secrets.WECHAT_TOKEN }}
WECHAT_ENCODINGAESKEY: ${{ secrets.WECHAT_ENCODINGAESKEY }}
WECHAT_RECEIVER_IDS: ${{ secrets.WECHAT_RECEIVER_IDS }}
WECHAT_MSG_TITLE: 'Reference: ${{ github.ref }}'
WECHAT_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with:
service: wechat
```
- **Variables**
| Variables | Default Value |
| -------------------------- | :----------------: |
| WECHAT_APPID | "" |
| WECHAT_APPSECRET | "" |
| WECHAT_TOKEN | "" |
| WECHAT_ENCODINGAESKEY | "" |
| WECHAT_RECEIVER_IDS | "" |
| WECHAT_MSG_TITLE | "" |
| WECHAT_MESSAGE | "" |
## TextMagic
TextMagic allows you to send SMS to multiple receivers provided by comma separated string.
```bash
pingme textmagic \
--token 'tokenabc' \
--user 'sid123' \
--title 'message title' \
--receiver '+140001442' \
--msg 'some message'
```
- GitHub Action
```yaml
on: [push]
jobs:
pingme-job:
runs-on: ubuntu-latest
name: PingMe
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Ping me On
uses: kha7iq/pingme-action@v1
env:
TEXTMAGIC_USER: ${{ secrets.TEXTMAGIC_USER }}
TEXTMAGIC_TOKEN: ${{ secrets.TEXTMAGIC_TOKEN }}
TEXTMAGIC_TITLE: 'Reference: ${{ github.ref }}'
TEXTMAGIC_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
TEXTMAGIC_RECEIVER: ${{ secrets.TEXTMAGIC_RECEIVER }}
with:
# Chose the messaging platform.
# slack / telegram / rocketchat / teams /
# pushover / discord / email / mattermost / textmagic
service: textmagic
```
- **Variables**
| Variables | Default Value |
| -------------------------- | :----------------: |
| TEXTMAGIC_USER | "" |
| TEXTMAGIC_TOKEN | "" |
| TEXTMAGIC_TITLE | "" |
| TEXTMAGIC_MESSAGE | "" |
| TEXTMAGIC_RECEIVER | "" |
## Matrix
Matrix uses either username and password, or an access token for authentication. Tokens will be used first, if not
present, username and password will be used. Similarly for --room, if not present, room will be determined using roomId
and domain.
```bash
pingme matrix \
--username 'matrix username' \
--password 'password' \
--token 'access token' \
--url 'https://matrix-client.matrix.org' \
--serverName 'server1.matrix.org' \
--room 'LRovrjPJaRChcTKgoK:matrix.org' \
--roomId 'LRovrjPJaRChcTKgoK' \
--domain 'matrix.org' \
--msg 'some message' \
--autoJoin
```
- GitHub Action
```yaml
on: [push]
jobs:
pingme-job:
runs-on: ubuntu-latest
name: PingMe
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Ping me On
uses: kha7iq/pingme-action@v1
env:
MATRIX_USERNAME: ${{ secrets.MATRIX_USERNAME }}
MATRIX_PASSWORD: ${{ secrets.MATRIX_PASSWORD }}
MATRIX_ACCESS_TOKEN: ${{ secrets.MATRIX_ACCESS_TOKEN }}
MATRIX_SERVER_URL: ${{ secrets.MATRIX_SERVER_URL }}
MATRIX_SERVER_NAME: ${{ secrets.MATRIX_SERVER_NAME }}
MATRIX_ROOM: ${{ secrets.MATRIX_ROOM }}
MATRIX_ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }}
MATRIX_DOMAIN: ${{ secrets.MATRIX_DOMAIN }}
MATRIX_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
MATRIX_AUTO_JOIN: ${{ secrets.MATRIX_AUTO_JOIN }}
with:
# Chose the messaging platform.
# slack / telegram / rocketchat / teams /
# pushover / discord / email / mattermost / textmagic / matrix
service: matrix
```
- **Variables**
| Variables | Default Value |
|--------------------| :----------------: |
| MATRIX_USERNAME | "" |
| MATRIX_PASSWORD | "" |
| MATRIX_ACCESS_TOKEN | "" |
| MATRIX_SERVER_URL | "" |
| MATRIX_SERVER_NAME | "" |
| MATRIX_ROOM | "" |
| MATRIX_ROOM_ID | "" |
| MATRIX_DOMAIN | "" |
| MATRIX_MESSAGE | "" |
| MATRIX_AUTO_JOIN | "" |

29
go.mod
View File

@ -3,26 +3,11 @@ module github.com/kha7iq/pingme
go 1.16
require (
github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect
github.com/go-openapi/analysis v0.21.3 // indirect
github.com/go-openapi/runtime v0.24.1 // indirect
github.com/go-openapi/spec v0.20.6 // indirect
github.com/go-openapi/strfmt v0.21.3 // indirect
github.com/go-openapi/validate v0.22.0 // indirect
github.com/gorilla/schema v1.4.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/gotify/go-api-client/v2 v2.0.4
github.com/gregdel/pushover v1.1.0
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/nikoksr/notify v0.27.0
github.com/sfreiberg/gotwilio v1.0.0
github.com/silenceper/wechat/v2 v2.1.3
github.com/slack-go/slack v0.11.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/stretchr/testify v1.8.0
github.com/textmagic/textmagic-rest-go-v2/v2 v2.0.3361 // indirect
github.com/urfave/cli/v2 v2.11.0
golang.org/x/net v0.38.0 // indirect
golang.org/x/oauth2 v0.0.0-20220630143837-2104d58473e0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
github.com/gregdel/pushover v0.0.0-20210216095829-2131362cb888
github.com/nikoksr/notify v0.17.0
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sfreiberg/gotwilio v0.0.0-20201211181435-c426a3710ab5
github.com/stretchr/testify v1.7.0
github.com/urfave/cli/v2 v2.3.0
)

672
go.sum

File diff suppressed because it is too large Load Diff

View File

@ -1,81 +0,0 @@
#!/bin/sh
# Usage: [sudo] [BINDIR=/usr/local/bin] ./install.sh [<BINDIR>]
#
# Example:
# 1. sudo ./install.sh /usr/local/bin
# 2. sudo ./install.sh /usr/bin
# 3. ./install.sh $HOME/usr/bin
# 4. BINDIR=$HOME/usr/bin ./install.sh
#
# Default BINDIR=/usr/bin
set -euf
if [ -n "${DEBUG-}" ]; then
set -x
fi
: ${BINDIR:="/usr/bin"}
if [ $# -gt 0 ]; then
BINDIR=$1
fi
_can_install() {
if [ ! -d "${BINDIR}" ]; then
mkdir -p "${BINDIR}" 2> /dev/null
fi
[ -d "${BINDIR}" ] && [ -w "${BINDIR}" ]
}
if ! _can_install && [ "$(id -u)" != 0 ]; then
printf "Run script as sudo\n"
exit 1
fi
if ! _can_install; then
printf -- "Can't install to %s\n" "${BINDIR}"
exit 1
fi
machine=$(uname -m)
case $machine in
armv7*)
machine="arm"
;;
aarch64)
machine="arm64"
;;
esac
case $(uname -s) in
Linux)
os="Linux"
;;
Darwin)
os="macOS"
;;
*)
printf "OS not supported\n"
exit 1
;;
esac
printf "Fetching latest version\n"
latest="$(curl -sL 'https://api.github.com/repos/kha7iq/pingme/releases/latest' | grep 'tag_name' | grep --only 'v[0-9\.]\+' | cut -c 2-)"
tempFolder="/tmp/pingme_v${latest}"
printf -- "Found version %s\n" "${latest}"
mkdir -p "${tempFolder}" 2> /dev/null
printf -- "Downloading pingme_%s_%s_%s.tar.gz\n" "${latest}" "${os}" "${machine}"
curl -sL -o "${tempFolder}/pingme.tar.gz" "https://github.com/kha7iq/pingme/releases/download/v${latest}/pingme_${os}_${machine}.tar.gz"
printf -- "Installing...\n"
tar -C "${tempFolder}" -xf "${tempFolder}/pingme.tar.gz"
install -m755 "${tempFolder}/pingme" "${BINDIR}/pingme"
printf "Cleaning up temp files\n"
rm -rf "${tempFolder}"
printf -- "Successfully installed pingme into %s/\n" "${BINDIR}"

12
main.go
View File

@ -1,16 +1,11 @@
package main
import (
"github.com/kha7iq/pingme/service/matrix"
"log"
"os"
"github.com/kha7iq/pingme/service/gotify"
"github.com/kha7iq/pingme/service/textmagic"
"github.com/kha7iq/pingme/service/mastodon"
"github.com/kha7iq/pingme/service/twillio"
"github.com/kha7iq/pingme/service/wechat"
"github.com/kha7iq/pingme/service/zulip"
"github.com/kha7iq/pingme/service/discord"
@ -39,8 +34,7 @@ func main() {
app.Description = `PingMe is a CLI tool which provides the ability to send messages or alerts to multiple
messaging platforms and also email, everything is configurable via environment
variables and command line switches.Currently supported platforms include Slack, Telegram,
RocketChat, Discord, Pushover, Mattermost, Pushbullet, Microsoft Teams, Twillio, Mastodon,
email address, Line, Gotify and Wechat.`
RocketChat, Discord, Pushover, Mattermost, Pushbullet, Microsoft Teams, Twillio, Mastodon and email address.`
// app.Commands contains the subcommands as functions which return []*cli.Command.
app.Commands = []*cli.Command{
telegram.Send(),
@ -56,10 +50,6 @@ email address, Line, Gotify and Wechat.`
zulip.Send(),
mastodon.Send(),
line.Send(),
wechat.Send(),
gotify.Send(),
textmagic.Send(),
matrix.Send(),
}
err := app.Run(os.Args)

View File

@ -1,97 +0,0 @@
package gotify
import (
"log"
"net/http"
"net/url"
"github.com/kha7iq/pingme/service/helpers"
"github.com/gotify/go-api-client/v2/auth"
"github.com/gotify/go-api-client/v2/client/message"
"github.com/gotify/go-api-client/v2/gotify"
"github.com/gotify/go-api-client/v2/models"
"github.com/urfave/cli/v2"
)
// Gotify struct holds data parsed via flags for the service
type Gotify struct {
URL string
Token string
Priority int
Title string
Message string
}
// Send parse values from *cli.context and return *cli.Command
func Send() *cli.Command {
var gotifyOpts Gotify
return &cli.Command{
Name: "gotify",
Usage: "Send push notification to gotify server",
UsageText: "pingme gotify --url 'https://example.com' --token 'tokenabc' --title 'some title' " +
" --msg 'some message' --priority 5",
Description: `With gotify you can send messages to any Gotify server`,
Flags: []cli.Flag{
&cli.StringFlag{
Destination: &gotifyOpts.Token,
Name: "token",
Aliases: []string{"t"},
Required: true,
Usage: "Application token of gotify server",
EnvVars: []string{"GOTIFY_TOKEN"},
},
&cli.StringFlag{
Destination: &gotifyOpts.URL,
Name: "url",
Required: true,
Aliases: []string{"u"},
Usage: "Gotify server Endpoint",
EnvVars: []string{"GOTIFY_URL"},
},
&cli.StringFlag{
Destination: &gotifyOpts.Message,
Name: "msg",
Aliases: []string{"m"},
Usage: "Message content",
EnvVars: []string{"GOTIFY_MESSAGE"},
},
&cli.StringFlag{
Destination: &gotifyOpts.Title,
Name: "title",
Usage: "Title of the message.",
Value: helpers.TimeValue,
EnvVars: []string{"GOTIFY_TITLE"},
},
&cli.IntFlag{
Destination: &gotifyOpts.Priority,
Name: "priority",
Aliases: []string{"p"},
Usage: "Message priority i.e 1-7",
Value: 5,
EnvVars: []string{"GOTIFY_PRIORITY"},
},
},
Action: func(ctx *cli.Context) error {
serverURL, err := url.Parse(gotifyOpts.URL)
if err != nil {
return err
}
c := gotify.NewClient(serverURL, &http.Client{})
params := message.NewCreateMessageParams()
params.Body = &models.MessageExternal{
Title: gotifyOpts.Title,
Message: gotifyOpts.Message,
Priority: gotifyOpts.Priority,
}
_, err = c.Message.CreateMessage(params, auth.TokenAuth(gotifyOpts.Token))
if err != nil {
return err
}
log.Println("Successfully sent!")
return nil
},
}
}

View File

@ -1,221 +0,0 @@
package matrix
import (
"fmt"
"github.com/matrix-org/gomatrix"
"github.com/urfave/cli/v2"
"strings"
)
type matrixPingMe struct {
Username string
Password string
Token string
Url string
ServerName string
Room string
RoomID string
Domain string
Message string
AutoJoin bool
}
func Send() *cli.Command {
var matrix matrixPingMe
return &cli.Command{
Name: "matrix",
Usage: "Send message via matrix",
UsageText: "pingme matrix --token 'syt_YW...E2qD' --room 'LRovrjPJaRChcTKgoK:matrix.org' " +
"--url 'matrix-client.matrix.org' --autoJoin --msg 'Hello, Matrix!'",
Flags: []cli.Flag{
&cli.StringFlag{
Destination: &matrix.Username,
Name: "username",
Aliases: []string{"u"},
Usage: "Matrix username",
EnvVars: []string{"MATRIX_USER"},
},
&cli.StringFlag{
Destination: &matrix.Password,
Name: "password",
Aliases: []string{"p"},
Usage: "Matrix password",
EnvVars: []string{"MATRIX_PASSWORD"},
},
&cli.StringFlag{
Destination: &matrix.Token,
Name: "token",
Aliases: []string{"t"},
Usage: "Matrix access token. Can be used instead of username+password",
EnvVars: []string{"MATRIX_ACCESS_TOKEN"},
},
&cli.StringFlag{
Destination: &matrix.Url,
Name: "url",
Usage: "Matrix server URL",
EnvVars: []string{"MATRIX_SERVER_URL"},
},
&cli.StringFlag{
Destination: &matrix.ServerName,
Name: "serverName",
Usage: "Can be provided if requests should be routed via a particular server",
EnvVars: []string{"MATRIX_SERVER_NAME"},
},
&cli.StringFlag{
Destination: &matrix.Room,
Name: "room",
Usage: "Matrix room to send the message to, in the format <roomId>:<domain>",
EnvVars: []string{"MATRIX_ROOM"},
},
&cli.StringFlag{
Destination: &matrix.RoomID,
Name: "roomId",
Usage: "Matrix room ID to send the message to. The exclamation mark at the beginning can be excluded.",
EnvVars: []string{"MATRIX_ROOM_ID"},
},
&cli.StringFlag{
Destination: &matrix.Domain,
Name: "domain",
Usage: "Used in conjunction with room ID to get the desired room",
EnvVars: []string{"MATRIX_DOMAIN"},
},
&cli.StringFlag{
Destination: &matrix.Message,
Name: "msg",
Aliases: []string{"m"},
Required: true,
Usage: "Message to send to matrix",
EnvVars: []string{"MATRIX_MESSAGE"},
},
&cli.BoolFlag{
Destination: &matrix.AutoJoin,
Name: "autoJoin",
Usage: "If enabled, will automatically join the specified room if not already joined",
EnvVars: []string{"MATRIX_AUTO_JOIN"},
},
},
Action: func(ctx *cli.Context) error {
// Login
client, err := matrix.login()
if err != nil {
return fmt.Errorf("failed to login to matrix: %v", err)
}
// Parse and set variables
err = matrix.setupVars()
if err != nil {
return err
}
// If necessary, join the given room
err = matrix.joinRoomIfNecessary(client)
if err != nil {
return err
}
// Send the message
_, err = client.SendText(matrix.Room, matrix.Message)
if err != nil {
return fmt.Errorf("failed to send matrix text: %v", err)
}
return nil
},
}
}
/*
setupVars will ensure the room ID begins with an exclamation mark and set the room string if not
already set, using the room ID and domain. If the room string, room id and domain are not set,
an error will be thrown.
*/
func (m *matrixPingMe) setupVars() error {
// Format the room ID
if !strings.HasPrefix(m.RoomID, "!") {
m.RoomID = "!" + m.RoomID
}
// Create the matrix room string if not already provided
if m.Room == "" {
if m.RoomID == "" || m.Domain == "" {
return fmt.Errorf("matrix room, or room ID and domain must be provided")
}
m.Room = fmt.Sprintf("%s:%s", m.RoomID, m.Domain)
}
return nil
}
/*
joinRoomIfNecessary gets all the joined rooms and checks if the desired room is in the list.
If not, and autoJoin is set to true - will attempt to join the room. If autoJoin is set to
false, an error will be thrown
*/
func (m *matrixPingMe) joinRoomIfNecessary(client *gomatrix.Client) error {
// Get already joined rooms
joined, err := client.JoinedRooms()
if err != nil {
return fmt.Errorf("failed to get joined rooms: %v", err)
}
// Check if we've already joined the desired room
foundRoom := false
for _, room := range joined.JoinedRooms {
if room == m.Room {
foundRoom = true
break
}
}
// If not, try auto join the room
if !foundRoom {
if !m.AutoJoin {
return fmt.Errorf("not joined room '%s' and --autoJoin is set to false", m.Room)
}
_, err = client.JoinRoom(m.Room, m.ServerName, nil)
if err != nil {
return fmt.Errorf("failed to auto join room '%s': %v", m.Room, err)
}
}
return nil
}
/*
login creates a gomatrix.Client instance, connecting to the given URL, using the provided login details
*/
func (m *matrixPingMe) login() (*gomatrix.Client, error) {
// Create a client instance
client, err := gomatrix.NewClient(m.Url, "", "")
if err != nil {
return nil, fmt.Errorf("failed to create matrix client: %v", err)
}
// Attempt to log in with whatever login details were provided.
// Or, throw an error if no login details were given
var resp *gomatrix.RespLogin
if m.Token != "" {
resp, err = client.Login(&gomatrix.ReqLogin{
Type: "m.login.token",
Token: m.Token,
})
if err != nil {
return nil, err
}
} else if m.Username != "" && m.Password != "" {
resp, err = client.Login(&gomatrix.ReqLogin{
Type: "m.login.password",
User: m.Username,
Password: m.Password,
})
if err != nil {
return nil, err
}
} else {
return nil, fmt.Errorf("no token, or username and password provided")
}
// Set the access token for this session
client.SetCredentials(resp.UserID, resp.AccessToken)
m.Token = resp.AccessToken
return client, nil
}

View File

@ -16,7 +16,6 @@ type pushOver struct {
Recipient string
Message string
Title string
Priority int
}
// Send parse values from *cli.context and return *cli.Command.
@ -62,27 +61,10 @@ All configuration options are also available via environment variables.`,
Usage: "Title of the message.",
EnvVars: []string{"PUSHOVER_TITLE"},
},
&cli.IntFlag{
Destination: &pushOverOpts.Priority,
Name: "priority",
Aliases: []string{"p"},
Value: 0,
Usage: "Priority of the message.",
EnvVars: []string{"PUSHOVER_PRIORITY"},
},
},
Action: func(ctx *cli.Context) error {
app := pushover.New(pushOverOpts.Token)
// message := &pushover.Message{Title: pushOverOpts.Title, Message: pushOverOpts.Message, Priority: pushOverOpts.Priority}
message := &pushover.Message{Title: pushOverOpts.Title,
Message: pushOverOpts.Message,
Priority: pushOverOpts.Priority,
Retry: 60,
Expire: 3600,
}
message := pushover.NewMessageWithTitle(pushOverOpts.Message, pushOverOpts.Title)
users := strings.Split(pushOverOpts.Recipient, ",")
for _, v := range users {

View File

@ -1,98 +0,0 @@
package textmagic
import (
"context"
"fmt"
"strings"
"github.com/nikoksr/notify"
"github.com/nikoksr/notify/service/textmagic"
"github.com/urfave/cli/v2"
)
//TextMagic struct describes required data needed to integrate with TextMagic
type TextMagic struct {
Token string
User string
Subject string
Message string
Receiver string
}
//Send method sends a message via TextMagic service
func Send() *cli.Command {
var textMagicOpts TextMagic
return &cli.Command{
Name: "textmagic",
Usage: "Send message via TextMagic",
UsageText: "pingme textmagic --token 'tokenabc' --user 'sid123' " +
"--title 'foo' --receiver '+140001442' --msg 'some message'",
Description: `textmagic provides ability to send sms to multiple numbers.
You can specify multiple receivers by separating the value with a comma.`,
Flags: []cli.Flag{
&cli.StringFlag{
Destination: &textMagicOpts.Token,
Name: "token",
Usage: "TextMagic token",
Aliases: []string{"t"},
Required: true,
EnvVars: []string{"TEXTMAGIC_TOKEN"},
},
&cli.StringFlag{
Destination: &textMagicOpts.User,
Name: "user",
Usage: "TextMagic user",
Aliases: []string{"u"},
Required: true,
EnvVars: []string{"TEXTMAGIC_USER"},
},
&cli.StringFlag{
Destination: &textMagicOpts.Subject,
Name: "title",
Usage: "Title of the message",
EnvVars: []string{"TEXTMAGIC_TITLE"},
},
&cli.StringFlag{
Destination: &textMagicOpts.Receiver,
Name: "receiver",
Usage: "Receiver(s) of the message",
Aliases: []string{"r"},
Required: true,
EnvVars: []string{"TEXTMAGIC_RECEIVER"},
},
&cli.StringFlag{
Destination: &textMagicOpts.Message,
Name: "msg",
Usage: "Message to send",
Aliases: []string{"m"},
Required: true,
EnvVars: []string{"TEXTMAGIC_MESSAGE"},
},
},
Action: func(c *cli.Context) error {
textMagicService := textmagic.New(textMagicOpts.User, textMagicOpts.Token)
receivers, err := getReceivers(textMagicOpts.Receiver)
if err != nil {
return fmt.Errorf("invalid receivers provided, %w", err)
}
textMagicService.AddReceivers(receivers...)
notifier := notify.New()
notifier.UseServices(textMagicService)
err = notifier.Send(context.Background(), textMagicOpts.Subject, textMagicOpts.Message)
if err != nil {
return fmt.Errorf("could not send textMagic message, %w", err)
}
return nil
},
}
}
func getReceivers(receivers string) ([]string, error) {
if len(receivers) == 0 {
return nil, fmt.Errorf("no receivers found")
}
r := strings.Split(receivers, ",")
return r, nil
}

View File

@ -1,120 +0,0 @@
package wechat
import (
"context"
"log"
"strings"
"github.com/kha7iq/pingme/service/helpers"
"github.com/nikoksr/notify"
"github.com/nikoksr/notify/service/wechat"
"github.com/silenceper/wechat/v2/cache"
"github.com/urfave/cli/v2"
)
// Wechat struct holds data parsed via flags for the service.
type Wechat struct {
AppID string
AppSecret string
Token string
EncodingAESKey string
Title string
Message string
Receivers string
}
// Send parse values from *cli.context and return *cli.Command.
// Values include wechat official account id, secret, server token, encoding AES key,
// Message, Title, and Receivers.
// If multiple receivers are provided then the string is split with "," separator and
// each receiverID is added to receiver.
func Send() *cli.Command {
var wechatOpts Wechat
return &cli.Command{
Name: "wechat",
Usage: "Send message to wechat official account",
Description: `Wechat sends message to Wechat Official Account using appid, appsecrete
and server token to authenticate
AND then send messages to defined account.
Multiple receiverss can be used separated by comma.`,
UsageText: "pingme wechat --appid '123' --appsecret '123' --token '123' --aes '123' --msg 'some message' --receivers 'aaa,bbb,ccc'",
Flags: []cli.Flag{
&cli.StringFlag{
Destination: &wechatOpts.AppID,
Name: "appid",
Required: true,
Usage: "AppID of wechat official account.",
EnvVars: []string{"WECHAT_APPID"},
},
&cli.StringFlag{
Destination: &wechatOpts.AppSecret,
Name: "appsecret",
Required: true,
Usage: "AppSecret of wechat official account.",
EnvVars: []string{"WECHAT_APPSECRET"},
},
&cli.StringFlag{
Destination: &wechatOpts.Token,
Name: "token",
Required: true,
Usage: "Token of server used for sending message.",
EnvVars: []string{"WECHAT_TOKEN"},
},
&cli.StringFlag{
Destination: &wechatOpts.EncodingAESKey,
Name: "aes",
Required: true,
Usage: "Encoding AES Key of server used for sending message.",
EnvVars: []string{"WECHAT_ENCODING_AES_KEY"},
},
&cli.StringFlag{
Destination: &wechatOpts.Receivers,
Name: "receivers",
Required: true,
Usage: "Comma-separated list of receiver IDs.",
EnvVars: []string{"WECHAT_RECEIVERS"},
},
&cli.StringFlag{
Destination: &wechatOpts.Message,
Name: "msg",
Required: true,
Usage: "Message content.",
EnvVars: []string{"WECHAT_MESSAGE"},
},
&cli.StringFlag{
Destination: &wechatOpts.Title,
Name: "title",
Value: helpers.TimeValue,
Usage: "Title of the message.",
EnvVars: []string{"WECHAT_TITLE"},
},
},
Action: func(ctx *cli.Context) error {
wechatSvc := wechat.New(&wechat.Config{
AppID: wechatOpts.AppID,
AppSecret: wechatOpts.AppSecret,
Token: wechatOpts.Token,
EncodingAESKey: wechatOpts.EncodingAESKey,
Cache: cache.NewMemory(),
})
// Add receiver IDs
recv := strings.Split(wechatOpts.Receivers, ",")
for _, r := range recv {
wechatSvc.AddReceivers(r)
}
notifier := notify.New()
notifier.UseServices(wechatSvc)
err := notifier.Send(context.Background(), wechatOpts.Title, wechatOpts.Message)
if err != nil {
log.Fatalf("notifier.Send() failed: %s", err.Error())
}
log.Println("Successfully sent!")
return nil
},
}
}