Configuration

At a minimum you'll want to make sure you have your webhook listening port set as well as one Discord server added to the servers property.

Full Config Example

{
  // Http listening interface for raw webhook data, use "*" to listen on all interfaces.
  "host": "*",
  // Http listener port for raw webhook data.
  "port": 8008,
  // Locale language translation
  "locale": "en",
  // Telemetry reporting
  "sentry": true,
  // yourls.org API
  "shortUrlApi": {
    // Determines whether the Short URL API is used or not
    "enabled": false,
    // ShortURL API (i.e. `https://domain.com/yourls-api.php`)
    "apiUrl": "https://domain.com/u/api.php",
    // ShortURL passwordless authentication signature
    "signature": ""
  },
  "stripeApi": {
    "apiKey": ""
  },
  // List of Discord servers to connect and post webhook messages to.
  "servers": {
    // Discord server #1 guild ID (replace `000000000000000123` with
    // actual guild id of server)
    "000000000000000123": "discord1.example.json",
    // 2nd Discord server section (if applicable)
    "000000000000000456": "discord2.example.json"
  },
  // Database configuration
  "database": {
    // Database to store notification subscriptions.
    "main": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // Brock database name.
      "database": "brockdb"
    },
    "scanner": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // RDM database name.
      "database": "rdmdb"
    },
    "nests": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // PMSF manual nests database name.
      "database": "manualdb"
    }
  },
  "eventPokemon": {
    // Determines if filtering event Pokemon is enabled or not.
    "enabled": false,
    // List of Pokemon IDs to treat as event and restrict postings and subscriptions to 90% IV or higher. (Filled in  automatically with `event set` command)  
    "pokemonIds": [],
    // Minimum IV value for an event Pokemon to have to meet in order to post via Discord channel alarm or direct message subscription.
    "eventMinimumIV": 90,
    // Event Pokemon filtering type
    "type": "Include",
    // Ignore event Pokemon if missing IV stats
    "ignoreMissingStats": true
  },
  // URL config
  "urls": {
    // Scanner map url DTS option for embeds as `scanmaps_url`.  
    // {0} and {1} are placeholders to construct the url with latitude
    // and longitude coordinates
    "scannerMap": "http://map.example.com/@/{0}/{1}/15"
  },
  // Available icon styles
  "iconStyles": {
    // Default icon style
    "Default": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Default",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/WatWowMap/wwm-uicons/main/"
      },
      // Pokemon icon type object to modify
      "Pokemon": {
        // Icon type display name
        "name": "Default_Pokemon",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnShuffleMap/master/UICONS/pokemon/"
      }
      /*
      "Raid",
      "Egg",
      "Gym",
      "Pokestop",
      "Reward",
      "Invasion",
      "Type",
      "Nest",
      "Team",
      "Weather",
      "Misc",
      */
    },
    // Pokemon Home Icons
    "Home": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Home",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnHomeIcons/master/UICONS_OS/"
      }
    },
    // Pokemon Shuffle Icons
    "Shuffle": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Shuffle",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnShuffleMap/master/UICONS/"
      }
    },
    // Pokemon Go Application Icons
    "Pokemon Go": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Pokemon Go",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/whitewillem/PogoAssets/main/uicons/"
      }
    },
    // PMSF Icons
    "PMSF": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "PMSF",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/pmsf/PMSF/develop/static/sprites/"
      }
    }
  },
  // Custom static map template files for each alarm type
  "staticMaps": {
    // Base url for static map service
    "url": "http://tiles.example.com:8080",
    // StaticMap or MultiStaticMap
    "type": "StaticMap",
    // Include nearby gyms with static map image  
    "includeGyms": false,
    // Include nearby pokestops with static map image  
    "includePokestops": false,
    // Including Gyms and Pokestops on the StaticMap only works if `pregenerate` is set to `true`
    "pregenerate": true
  },
  // Get text message alerts with Twilio.com
  "twilio": {
    // Determines if text message alerts are enabled
    "enabled": false,
    // Twilio account SID (Get via Twilio dashboard)
    "accountSid": "",
    // Twilio account auth token (Get via Twilio dashboard)
    "authToken": "",
    // Twilio phone number that will be sending the text message alert
    "from": "",
    // List of Discord user ids that can receive text message alerts
    "userIds": [],
    // List of Discord roles that can receive text message alerts
    "roleIds": [],
    // List of acceptable Pokemon to receive text message alerts for
    "pokemonIds": [201, 480, 481, 482, 443, 444, 445, 633, 634, 635, 610, 611, 612],
    // Minimum acceptable IV value for Pokemon if not ultra rare (Unown, Lake Trio)
    "minIV": 100
  },
  "reverseGeocoding": {
    // Reverse geocoding provider
    "provider": "osm", // osm/gmaps
    // Cache reverse geocoding responses to disk to reduce request count
    "cacheToDisk": true,
    // Google Maps reverse geocoding
    "gmaps": {
      // Google maps key for reverse geocoding  
      "key": "",
      // Google maps template schema for embeds  
      "schema": "{{Results.[0].FormattedAddress}}"
    },
    // OpenStreetMaps Nominatim reverse geocoding  
    "nominatim": {
      // OSM Nominatim endpoint
      "endpoint": "",
      // OSM Nominatim template schema for embeds
      "schema": "{{Address.Road}} {{Address.State}} {{Address.Postcode}} {{Address.Country}}"
    }
  },
  // Minimum despawn time in minutes a Pokemon must have in order to send the alarm (default: 5 minutes)
  "despawnTimeMinimumMinutes": 5,
  // Reload subscriptions every minute to sync with WhMgr-UI changes  
  "reloadSubscriptionChangesMinutes": 1,
  // Check for duplicate webhooks
  "checkForDuplicates": true,
  // Log webhook payloads to a file for debugging (do not enable unless you're having issues receiving data
  "debug": false,
  /*
   * Only show logs with higher or equal priority levels:
   * Trace: 0
   * Debug: 1
   * Info: 2
   * Warning: 3
   * Error: 4
   * Critical: 5
   * None: 6
  */
  "logLevel": 0,
  // Acceptable and interested PVP leagues to parse.
  "pvpLeagues": {
    // League name key to match webhook key for PVP ranks.
    "little": {
      // League minimum acceptable CP
      "minCP": 450,
      // League maximum acceptable CP
      "maxCP": 500,
      // League minimum rank to meet
      "minRank": 1,
      // League maximum rank to meet
      "maxRank": 100
    },
    "great": {
      "minCP": 1400,
      "maxCP": 1500,
      "minRank": 1,
      "maxRank": 100
    },
    "ultra": {
      "minCP": 2400,
      "maxCP": 2500,
      "minRank": 1,
      "maxRank": 100
    }
  }
}

Top Level

{
  // Http listening interface for raw webhook data, use "*" to listen on all interfaces.
  "host": "*",
  // Http listener port for raw webhook data.
  "port": 8008,
  // Locale language translation
  "locale": "en",
  // Minimum despawn time in minutes a Pokemon must have in order to send the alarm (default: 5 minutes)
  "despawnTimeMinimumMinutes": 5,
  // Reload subscriptions every minute to sync with WhMgr-UI changes  
  "reloadSubscriptionChangesMinutes": 1,
  // Check for duplicate webhooks
  "checkForDuplicates": true,
  // Log webhook payloads to a file for debugging (do not enable unless you're having issues receiving data)
  "debug": false,
  /*
   * Only show logs with higher or equal priority levels:
   * Trace: 0
   * Debug: 1
   * Info: 2
   * Warning: 3
   * Error: 4
   * Critical: 5
   * None: 6
  */
  "logLevel": 0   "logLevel": 0,
  // Acceptable and interested PVP leagues to parse.
  "pvpLeagues": {
    // League name key to match webhook key for PVP ranks.
    "little": {
      // League minimum acceptable CP
      "minCP": 450,
      // League maximum acceptable CP
      "maxCP": 500,
      // League minimum rank to meet
      "minRank": 1,
      // League maximum rank to meet
      "maxRank": 100
    },
    "great": {
      "minCP": 1400,
      "maxCP": 1500,
      "minRank": 1,
      "maxRank": 100
    },
    "ultra": {
      "minCP": 2400,
      "maxCP": 2500,
      "minRank": 1,
      "maxRank": 100
    }
  }
}

Discord Servers

{
  // List of Discord servers to connect and post webhook messages to.
  "servers": {
    // Discord server #1 guild ID (replace `000000000000000123` with
    // actual guild id of server)
    "000000000000000123": "discord1.example.json",
    // 2nd Discord server section (if applicable)
    "000000000000000456": "discord2.example.json"
  }
}

Short Url API

{
  // yourls.org API
  "shortUrlApi": {
    // Determines whether the Short URL API is used or not
    "enabled": false,
    // ShortURL API (i.e. `https://domain.com/yourls-api.php`)
    "apiUrl": "https://domain.com/u/api.php",
    // ShortURL passwordless authentication signature
    "signature": ""
  }
}

Stripe API

{
  "stripeApi": {
    // Stripe API key (Stripe production API key, i.e. rk_3824802934
    "apiKey": "",
  }
}

Database Schemas

{
  // Database configuration
  "database": {
    // Database to store notification subscriptions.
    "main": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // Brock database name.
      "database": "brockdb"
    },
    "scanner": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // RDM database name.
      "database": "rdmdb"
    },
    "nests": {
      // Database hostname or IP address.
      "host": "127.0.0.1",
      // Database connection port.
      "port": 3306,
      // Database user account name.
      "username": "root",
      // Database user account password.
      "password": "password",
      // PMSF manual nests database name.
      "database": "manualdb"
    }
  }
}

URLs

{
  // URL config
  "urls": {
    // Scanner map url DTS option for embeds as `scanmaps_url`.  
    // {0} and {1} are placeholders to construct the url with latitude
    // and longitude coordinates
    "scannerMap": "https://map.example.com/@/{0}/{1}/15"
  }
}

Twilio Text Message Notifications

{
  // Get text message alerts with Twilio.com
  "twilio": {
    // Determines if text message alerts are enabled
    "enabled": false,
    // Twilio account SID (Get via Twilio dashboard)
    "accountSid": "",
    // Twilio account auth token (Get via Twilio dashboard)
    "authToken": "",
    // Twilio phone number that will be sending the text message alert
    "from": "",
    // List of Discord user ids that can receive text message alerts
    "userIds": [],
    // List of Discord roles that can receive text message alerts
    "roleIds": [],
    // List of acceptable Pokemon to receive text message alerts for
    "pokemonIds": [201, 480, 481, 482, 443, 444, 445, 633, 634, 635, 610, 611, 612],
    // Minimum acceptable IV value for Pokemon if not ultra rare (Unown, Lake Trio)
    "minIV": 100
  }
}

Icon Styles

{
  // Available icon styles
  "iconStyles": {
    // Default icon style
    "Default": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Default",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/WatWowMap/wwm-uicons/main/"
      },
      // Pokemon icon type object to modify
      "Pokemon": {
        // Icon type display name
        "name": "Default_Pokemon",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnShuffleMap/master/UICONS/pokemon/"
      }
      /*
      "Raid",
      "Egg",
      "Gym",
      "Pokestop",
      "Reward",
      "Invasion",
      "Type",
      "Nest",
      "Team",
      "Weather",
      "Misc",
      */
    },
    // Pokemon Home Icons
    "Home": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Home",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnHomeIcons/master/UICONS_OS/"
      }
    },
    // Pokemon Shuffle Icons
    "Shuffle": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Shuffle",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/nileplumb/PkmnShuffleMap/master/ICONS_STANDARD/"
      }
    },
    // Pokemon Go Application Icons
    "Pokemon Go": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "Pokemon Go",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/whitewillem/PogoAssets/resized/icons_large-uicons"
      }
    },
    // PokeDave Pokemon Shuffle Icons
    "PokeDave Shuffle": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "PokeDave Shuffle",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/jepke/pokedave_shuffle_icons_-PMSF-/master/UICONS/"
      }
    },
    // PMSF Icons
    "PMSF": {
      // Base icon type object to apply to all other icon types
      "Base": {
        // Icon type display name
        "name": "PMSF",
        // Icon type url path
        "path": "https://raw.githubusercontent.com/pmsf/PMSF/develop/static/sprites/"
      }
    }
  },
}

Static Map Templates

{
  // Custom static map template files for each alarm type
  "staticMaps": {
    // Static map template for Pokemon
    "pokemon": {
      // Static map url template for pokemon
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}",
      // Static map template file name without extension
      "template": "pokemon.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for Raids and Eggs
    "raids": {
      // Static map url template for raids
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}&team_id={{team_id}}",
      // Static map template file name without extension
      "template": "raids.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for Gym team control changes
    "gyms": {
      // Static map url template for gyms
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}&team_id={{team_id}}",
      // Static map template file name without extension
      "template": "gyms.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for field research quests
    "quests": {
      // Static map url template for quests
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}",
      // Static map template file name without extension
      "template": "quests.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for Team Rocket invasions
    "invasions": {
      // Static map url template for invasions
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}",
      // Static map template file name without extension
      "template": "invasions.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for Pokestop lures
    "lures": {
      // Static map url template for lures
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}",
      // Static map template file name without extension
      "template": "lures.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for weather changes
    "weather": {
      // Static map url template for weather
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}&polygon={{polygon}}",
      // Static map template file name without extension
      "template": "weather.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    },
    // Static map template for nest postings
    "nests": {
      // Static map url template for nests
      "url": "http://tiles.example.com/staticmap/{{template_name}}?lat={{lat}}&lon={{lon}}&url2={{url2}}&polygon={{polygon}}",
      // Static map template file name without extension
      "template": "nests.example",
      // Include nearby gyms in static map image  
      "includeGyms": false,
      // Include nearby pokestops in static map image
      "includePokestops": false
    }
  }
}

Reverse Geocoding

{
  // Reverse lookup of geocoordinates to physical address
  "reverseGeocoding": {
    // Reverse geocoding provider
    "provider": "osm", // osm/gmaps
    // Cache reverse geocoding responses to disk to reduce request count
    "cacheToDisk": true,
    // Google Maps reverse geocoding
    "gmaps": {
      // Google maps key for reverse geocoding  
      "key": "",
      // Google maps template schema for embeds  
      "schema": "{{Results.[0].FormattedAddress}}"
    },
    // OpenStreetMaps Nominatim reverse geocoding  
    "nominatim": {
      // OSM Nominatim endpoint
      "endpoint": "",
      // OSM Nominatim template schema for embeds
      "schema": "{{Address.Road}} {{Address.State}} {{Address.Postcode}} {{Address.Country}}"
    }
  }
}

PVP Leagues

{
  // Acceptable and interested PVP leagues to parse.
  "pvpLeagues": {
    // League name key to match webhook key for PVP ranks.
    "little": {
      // League minimum acceptable CP
      "minCP": 450,
      // League maximum acceptable CP
      "maxCP": 500,
      // League minimum rank to meet
      "minRank": 1,
      // League maximum rank to meet
      "maxRank": 100
    },
    "great": {
      "minCP": 1400,
      "maxCP": 1500,
      "minRank": 1,
      "maxRank": 100
    },
    "ultra": {
      "minCP": 2400,
      "maxCP": 2500,
      "minRank": 1,
      "maxRank": 100
    }
  }
}