Compare commits

...

17 Commits
3.0.4 ... 3.0.6

Author SHA1 Message Date
Kwoth
52c9ec670d Upped version to 3.0.6. Slightly updated hangman help string 2021-09-27 10:57:10 +02:00
Kwoth
1ac472c676 Urls will now properly work in embeds. Fixes #306 2021-09-27 10:52:14 +02:00
Kwoth
39f01a3164 Merge branch 'v3-dev' into 'v3'
Hangman Rewrite

See merge request Kwoth/nadekobot!164
2021-09-27 02:00:19 +00:00
Kwoth
486916944b Hangman Rewrite 2021-09-27 02:00:19 +00:00
Kwoth
68e96cd1bb Merge branch 'v3-docker' into 'v3'
V3 docker

See merge request Kwoth/nadekobot!163
2021-09-27 00:10:18 +00:00
Veovis
5a647d100a V3 docker 2021-09-27 00:10:18 +00:00
Kwoth
a562a571e2 - .shopadd will now ignore negative price input
- Make sure bot has manage roles permission for .xprr
- Small cleanup
2021-09-22 23:07:23 +02:00
Kwoth
12146ad2da Make sure the bot has manageroles permission for .aar 2021-09-22 22:41:00 +02:00
Kwoth
453ac3efd2 Re-did migration as the old one was wrong 2021-09-21 22:48:18 +02:00
Kwoth
c9e89e1911 - .logignore now supports targeting channels and users
- .logignore now lists all ignored channels and users when no parameter is provided
- Renamed and cleaned up some log-related fields
2021-09-21 22:39:24 +02:00
Kwoth
611817f78a Yes, it's just a warning 2021-09-21 20:59:05 +02:00
Kwoth
2e66137f3e Fixed an exception which was breaking repeater loop 2021-09-21 20:28:37 +02:00
Kwoth
2d92424dd4 Version upped to 3.0.5 2021-09-20 19:45:13 +02:00
Kwoth
ffba03adbe Added guides on the different ways to run the bot on linux - contributed by Bark Ranger 2021-09-18 06:19:53 +02:00
Kwoth
76ebb87fb5 updated docs formatting and windows from source update guide 2021-09-17 19:02:18 +02:00
Kwoth
4a50c30c56 Fixed .logserver - should no longer throw an exception if you had no logsettings previously 2021-09-17 17:19:11 +02:00
Kwoth
e70a91ae60 Fixed images not automatically reloading on startup if the keys don't exist 2021-09-17 17:10:38 +02:00
53 changed files with 5945 additions and 5100 deletions

View File

@@ -9,6 +9,7 @@
!src/NadekoBot.Generators/**
# Use Ayu stuff
!src/ayu/**
!docker-entrypoint.sh
# ignore bin and obj folders in projects
src/**/bin/*

View File

@@ -95,4 +95,31 @@ upload-windows-updater-release:
- sed -i "s/_VERSION_/$CI_COMMIT_TAG/g" releases-v3.json
- aws --version
- aws --endpoint-url $AWS_SERVICE_URL s3api put-object --bucket "$AWS_BUCKET_NAME" --key "dl/bot/$INSTALLER_FILE_NAME" --acl public-read --body "$INSTALLER_OUTPUT_DIR/$INSTALLER_FILE_NAME"
- aws --endpoint-url $AWS_SERVICE_URL s3api put-object --bucket "$AWS_BUCKET_NAME" --key "dl/bot/releases-v3.json" --acl public-read --body "releases-v3.json"
- aws --endpoint-url $AWS_SERVICE_URL s3api put-object --bucket "$AWS_BUCKET_NAME" --key "dl/bot/releases-v3.json" --acl public-read --body "releases-v3.json"
docker-build:
# Use the official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# Default branch leaves tag empty (= latest tag)
# All other branches are tagged with the escaped branch name (commit ref slug)
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag=""
echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
else
tag=":$CI_COMMIT_REF_SLUG"
echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
fi
- docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
- docker push "$CI_REGISTRY_IMAGE${tag}"
# Run this job in a branch where a Dockerfile exists
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile

View File

@@ -2,9 +2,35 @@
Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog.com/en/1.0.0/) except date format. a-c-f-r-o
## Unreleased
## [3.0.6] - 27.09.2021
### Added
- .logignore now supports ignoring users and channels. Use without parameters to see the ignore list
### Changed
- Hangman rewrite
- Hangman categories are now held in separate .yml files in data/hangman/XYZ.yml where XYZ is the category name
### Fixed
- Fixed an exception which caused repeater queue to break
- Fixed url field not working in embeds
## [3.0.5] - 20.09.2021
### Fixed
- Fixed images not automatically reloading on startup if the keys don't exist
- Fixed `.logserver` - it should no longer throw an exception if you had no logsettings previously
## [3.0.4] - 16.09.2021
### Added
- Fully translated to Brazilian Portuguese 🎉
- Added `%server.boosters%` and `%server.boost_level%` placeholders
- Added `DmHelpTextKeywords` to `data/bot.yml`
@@ -12,6 +38,7 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog.
- If no keywords are specified, bot will reply to every DM (like before)
### Fixed
- Possible fix for `.repeat` bug
- Slight adjustment for repeater logic
- Timer should no longer increase on some repeaters

View File

@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /source
COPY src/NadekoBot/*.csproj src/NadekoBot/
@@ -9,14 +9,33 @@ RUN dotnet restore src/NadekoBot/
COPY . .
WORKDIR /source/src/NadekoBot
RUN dotnet --version
RUN dotnet publish -c Release -o /app --no-restore
RUN set -xe; \
dotnet --version; \
dotnet publish -c Release -o /app --no-restore; \
mv /app/data /app/data_init; \
rm -Rf libopus* libsodium* opus.* runtimes/win* runtimes/osx* runtimes/linux-arm* runtimes/linux-mips*; \
find /app -type f -exec chmod -x {} \; ;\
chmod +x /app/NadekoBot
# final stage/image
FROM mcr.microsoft.com/dotnet/runtime:5.0
FROM mcr.microsoft.com/dotnet/runtime:5.0-buster-slim
WORKDIR /app
RUN set -xe; \
useradd -m nadeko; \
apt-get update; \
apt-get install -y libopus0 libsodium23 libsqlite3-0 curl ffmpeg python3 sudo; \
update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1; \
echo 'Defaults>nadeko env_keep+="ASPNETCORE_* DOTNET_* NadekoBot_* shard_id total_shards TZ"' > /etc/sudoers.d/nadeko; \
curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl; \
chmod +x /usr/local/bin/youtube-dl
COPY --from=build /app ./
COPY docker-entrypoint.sh /usr/local/sbin
ENV shard_id=0
ENV total_shards=1
WORKDIR /app
COPY --from=build /app ./
VOLUME [ "app/data", "app/creds.yml", "app/creds_example.yml" ]
ENTRYPOINT dotnet NadekoBot.dll "$shard_id" "$total_shards"
VOLUME [ "app/data" ]
ENTRYPOINT [ "/usr/local/sbin/docker-entrypoint.sh" ]
CMD dotnet NadekoBot.dll "$shard_id" "$total_shards"

20
docker-entrypoint.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/sh
set -e;
data_init=/app/data_init
data=/app/data
# populate /app/data if empty
for i in $(ls $data_init)
do
if [ ! -e "$data/$i" ]; then
[ -f "$data_init/$i" ] && cp "$data_init/$i" "$data/$i"
[ -d "$data_init/$i" ] && cp -r "$data_init/$i" "$data/$i"
fi
done
# fix folder permissions
chown -R nadeko:nadeko "$data"
# drop to regular user and launch command
exec sudo -u nadeko "$@"

View File

@@ -1,3 +1,35 @@
# Setting up NadekoBot with Docker
Soon:tm:
# DO NOT USE YET - WORK IN PROGRESS
Upgrade from 2.x to v3 does not work because the file is mount readonly
### Docker Compose
```yml
version: "3.7"
services:
nadeko:
image: registry.gitlab.com/veovis/nadekobot:v3-docker
depends_on:
- redis
environment:
TZ: Europe/Paris
#NadekoBot_RedisOptions: redis,name=nadeko
#NadekoBot_ShardRunCommand: dotnet
#NadekoBot_ShardRunArguments: /app/NadekoBot.dll {0} {1}
volumes:
- /srv/nadeko/conf/creds.yml:/app/creds.yml:ro
- /srv/nadeko/data:/app/data
redis:
image: redis:4-alpine
sysctls:
- net.core.somaxconn=511
command: redis-server --maxmemory 32M --maxmemory-policy volatile-lru
volumes:
- /srv/nadeko/redis-data:/data
```
### Updating
- `cd /srv/nadeko`
- `docker-compose pull`
- `docker-compose up -d`

View File

@@ -16,12 +16,12 @@ Open Terminal (if you're on an installation with a window manager) and navigate
4. Exit the installer in order to set up your `creds.yml`
5. Copy the creds.yml template `cp nadekobot/output/creds_example.yml nadekobot/output/creds.yml`
6. Open `nadekobot/output/creds.yml` with your favorite text editor. We will use nano here
- `nano nadekobot/output/creds.yml`
- `nano nadekobot/output/creds.yml`
7. [Enter your bot's token](../../creds-guide)
- After you're done, you can close nano (and save the file) by inputting, in order
- `CTRL` + `X`
- `Y`
- `Enter`
- After you're done, you can close nano (and save the file) by inputting, in order
- `CTRL` + `X`
- `Y`
- `Enter`
8. Run the bot (type `3` and press enter)
##### Update Instructions
@@ -37,51 +37,51 @@ Open Terminal (if you're on an installation with a window manager) and navigate
##### Installation Instructions
1. Download the latest release from <https://gitlab.com/Kwoth/nadekobot/-/releases>
- Look for the file called "X.XX.X-linux-x64-build.tar" (where X.XX.X is a series of numbers) and download it
- Look for the file called "X.XX.X-linux-x64-build.tar" (where X.XX.X is a series of numbers) and download it
2. Untar it
- ⚠ Make sure that you change X.XX.X to the same series of numbers as in step 1!
- `tar xf X.XX.X-linux-x64-build.tar`
- ⚠ Make sure that you change X.XX.X to the same series of numbers as in step 1!
- `tar xf X.XX.X-linux-x64-build.tar`
3. Rename the `nadekobot-linux-x64` to `nadekobot`
- `mv nadekobot-linux-x64 nadekobot`
- `mv nadekobot-linux-x64 nadekobot`
4. Move into nadekobot directory and make NadekoBot executable
- `cd nadekobot && chmod +x NadekoBot`
- `cd nadekobot && chmod +x NadekoBot`
5. Copy the creds.yml template
- `cp creds_example.yml creds.yml`
- `cp creds_example.yml creds.yml`
6. Open `creds.yml` with your favorite text editor. We will use nano here
- `nano nadekobot/output/creds.yml`
- `nano nadekobot/output/creds.yml`
8. [Enter your bot's token](#creds-guide)
- After you're done, you can close nano (and save the file) by inputting, in order
- `CTRL` + `X`
- `Y`
- `Enter`
- After you're done, you can close nano (and save the file) by inputting, in order
- `CTRL` + `X`
- `Y`
- `Enter`
9. Run the bot
- `./NadekoBot`
- `./NadekoBot`
##### Update Instructions
1. Stop the bot
2. Download the latest release from <https://gitlab.com/Kwoth/nadekobot/-/releases>
- Look for the file called "X.XX.X-linux-x64-build.tar" (where X.XX.X is a series of numbers) and download it
- Look for the file called "x.x.x-linux-x64-build.tar" (where `X.X.X` is a version, for example 3.0.4) and download it
3. Untar it
- ⚠ Make sure that you change X.XX.X to the same series of numbers as in step 2!
- `tar xf 2.99.8-linux-x64-build.tar`
- ⚠ Make sure that you change `X.X.X` to the same series of numbers as in step 2!
- `tar xf x.x.x-linux-x64-build.tar`
4. Rename the old nadekobot directory to nadekobot-old (remove your old backup first if you have one, or back it up under a different name)
- `rm -rf nadekobot-old 2>/dev/null`
- `mv nadekobot nadekobot-old`
- `rm -rf nadekobot-old 2>/dev/null`
- `mv nadekobot nadekobot-old`
5. Rename the new nadekobot directory to nadekobot
- `mv nadekobot-linux-x64 nadekobot`
- `mv nadekobot-linux-x64 nadekobot`
6. Remove old strings and aliases to avoid overwriting the updated versions of those files
- ⚠ If you've modified said files, back them up instead
- `rm nadekobot-old/data/aliases.yml`
- `rm -r nadekobot-old/data/strings`
- ⚠ If you've modified said files, back them up instead
- `rm nadekobot-old/data/aliases.yml`
- `rm -r nadekobot-old/data/strings`
7. Copy old data
- `cp -RT nadekobot-old/data/ nadekobot/data/`
- `cp -RT nadekobot-old/data/ nadekobot/data`
8. Copy creds.yml
- `cp nadekobot-old/creds.yml nadekobot/`
- `cp nadekobot-old/creds.yml nadekobot/`
9. Move into nadekobot directory and make the NadekoBot executable
- `cd nadekobot && chmod +x NadekoBot`
- `cd nadekobot && chmod +x NadekoBot`
10. Run the bot
- `./NadekoBot`
- `./NadekoBot`
🎉 Enjoy
@@ -95,7 +95,135 @@ mv nadekobot nadekobot-old && \
mv nadekobot-linux-x64 nadekobot && \
rm nadekobot-old/data/aliases.yml && \
rm -r nadekobot-old/data/strings && \
cp -RT nadekobot-old/data/ nadekobot/data/ && \
cp -RT nadekobot-old/data/ nadekobot/data && \
cp nadekobot-old/creds.yml nadekobot/ && \
cd nadekobot && chmod +x NadekoBot
```
## Running Nadeko
While there are two run modes built into the installer, these options only run Nadeko within the current session. Below are 3 methods of running Nadeko as a background process.
### Tmux (Preferred Method)
Using `tmux` is the simplest method, and is therefore recommended for most users.
1. Start a tmux session:
- `tmux`
2. Navigate to the project's root directory
- Project root directory location example: `/home/user/nadekobot/`
3. Enter the `output` directory:
- `cd output`
4. Run the bot using:
- `dotnet NadekoBot.dll`
5. Detatch the tmux session:
- Press `Ctrl` + `B`
- Then press `D`
Nadeko should now be running in the background of your system. To re-open the tmux session to either update, restart, or whatever, execute `tmux a`.
### Systemd
Compared to using tmux, this method requires a little bit more work to set up, but has the benefit of allowing Nadeko to automatically start back up after a system reboot or the execution of the `.die` command.
1. Navigate to the project's root directory
- Project root directory location example: `/home/user/nadekobot/`
2. Use the following command to create a service that will be used to start Nadeko:
```bash
echo "[Unit]
Description=NadekoBot service
After=network.target
[Service]
Type=simple
User=$USER
WorkingDirectory=$PWD/output
# If you want Nadeko to be compiled prior to every startup, uncomment the lines
# below. Note that it's not neccessary unless you are personally modifying the
# source code.
#ExecStartPre=/usr/bin/dotnet build ../src/NadekoBot/NadekoBot.csproj -c Release -o output/
ExecStart=/usr/bin/dotnet NadekoBot.dll
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=NadekoBot
Restart=always
[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/nadeko.service
```
3. Make the new service available:
- `sudo systemctl daemon-reload`
4. Start Nadeko:
- `sudo systemctl start nadeko.service && sudo systemctl enable nadeko.service`
### Systemd + Script
This method is similar to the one above, but requires one extra step, with the added benefit of better error logging and control over what happens before and after the startup of Nadeko.
1. Locate the project and move to its parent directory
- Project location example: `/home/user/nadekobot/`
- Parent directory example: `/home/user/`
2. Use the following command to create a service that will be used to execute `NadekoRun.sh`:
```bash
echo "[Unit]
Description=NadekoBot service
After=network.target
[Service]
Type=simple
User=$USER
WorkingDirectory=$PWD
ExecStart=/bin/bash NadekoRun.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=NadekoBot
[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/nadeko.service
```
3. Make the new service available:
- `sudo systemctl daemon-reload`
4. Use the following command to create a script that will be used to start Nadeko:
```bash
echo "#\!/bin/bash
echo \"\"
echo \"Running NadekoBot in the background with auto restart\"
youtube-dl -U
# If you want Nadeko to be compiled prior to every startup, uncomment the lines
# below. Note that it's not neccessary unless you are personally modifying the
# source code.
#echo \"Compiling NadekoBot...\"
#cd \"$PWD\"/nadekobot
#dotnet build src/NadekoBot/NadekoBot.csproj -c Release -o output/
echo \"Starting NadekoBot...\"
while true; do
{
cd \"$PWD\"/nadekobot/output
dotnet NadekoBot.dll
## If a non-zero exit code is produced, exit this script.
} || {
error_code=\"\$?\"
echo \"An error occurred when trying to start NadekBot\"
echo \"EXIT CODE: \$?\"
exit \"\$error_code\"
}
youtube-dl -U
echo \"Restarting NadekoBot...\"
done
echo \"Stopping NadekoBot...\"" > NadekoRun.sh
```
5. Start Nadeko:
- `sudo systemctl start nadeko.service && sudo systemctl enable nadeko.service`

View File

@@ -80,6 +80,7 @@ You can still install them manually:
Open PowerShell (press windows button on your keyboard and type powershell, it should show up; alternatively, right click the start menu and select Windows PowerShell), and navigate to the location where you want to install the bot (for example `cd ~/Desktop/`)
1. `git clone https://gitlab.com/kwoth/nadekobot -b v3 --depth 1`
2. `cd nadekobot`
3. `dotnet publish -c Release -o output/ src/NadekoBot/`
4. `cd output && cp creds_example.yml creds.yml`
5. Open `creds.yml` with your favorite text editor (Please don't use Notepad or WordPad. You can use Notepad++, VSCode, Atom, Sublime, or something similar)
@@ -91,16 +92,30 @@ Open PowerShell (press windows button on your keyboard and type powershell, it s
Open PowerShell as described above and run the following commands:
1. Navigate to your bot's folder, for example `cd ~/Desktop/nadekobot/src/NadekoBot`
2. Pull the latest updates (this will fail if you have custom code changes).
- If you don't have custom code changes, just run `git pull`
- If you do have custom code changes, You have 3 options
- Undo all changes with `git checkout -- * && git pull`
- Stash changes and try to re-apply them `git stash && git pull && git stash apply`
- Commit your changes and resolve merge conflicts `git add . && git commit -m "My commit message" && git pull`
3. Re-run the bot `dotnet run -c Release`
1. Stop the bot
- ⚠️ Make sure you don't have your database, credentials or any other nadekobot folder open in some application, this might prevent some of the steps from executing succesfully
2. Navigate to your bot's folder, example:
- `cd ~/Desktop/nadekobot`
3. Pull the new version
- `git pull`
- ⚠️ If this fails, you may want to stash or remove your code changes if you don't know how to resolve merge conflicts
4. **Backup** old output in case your data is overwritten
- `cp -r -fo output/ output-old`
5. Build the bot again
- `dotnet publish -c Release -o output/ src/NadekoBot/`
6. Remove old strings and aliases to avoid overwriting the updated versions of those files
- ⚠ If you've modified said files, back them up instead
- `rm output-old/data/aliases.yml`
- `rm -r output-old/data/strings`
7. Copy old data
- `cp -Recurse .\output-old\data\ .\output\ -Force`
8. Copy creds.yml
- `cp output-old/creds.yml output/`
9. Run the bot
- `cd output`
- `dotnet NadekoBot.dll`
⚠ You're expected to understand that your database will be in `bin/Release/<framework>/data/`, and if `<framework>` gets changed in the future, you will have to move your database manually.
🎉 Enjoy
#### Music prerequisites
In order to use music commands, you need ffmpeg and youtube-dl installed.

View File

@@ -102,7 +102,6 @@ namespace NadekoBot
.AddSingleton(Client) // discord socket client
.AddSingleton(_commandService)
.AddSingleton(this)
.AddSingleton<IDataCache, RedisCache>()
.AddSingleton<ISeria, JsonSeria>()
.AddSingleton<IPubSub, RedisPubSub>()
.AddSingleton<IConfigSeria, YamlSeria>()
@@ -132,10 +131,18 @@ namespace NadekoBot
}
else
{
svcs.AddSingleton<ICoordinator, RemoteGrpcCoordinator>()
.AddSingleton<IReadyExecutor>(x => (IReadyExecutor)x.GetRequiredService<ICoordinator>());
svcs.AddSingleton<RemoteGrpcCoordinator>()
.AddSingleton<ICoordinator>(x => x.GetRequiredService<RemoteGrpcCoordinator>())
.AddSingleton<IReadyExecutor>(x => x.GetRequiredService<RemoteGrpcCoordinator>());
}
svcs.AddSingleton<RedisLocalDataCache>()
.AddSingleton<ILocalDataCache>(x => x.GetRequiredService<RedisLocalDataCache>())
.AddSingleton<RedisImagesCache>()
.AddSingleton<IImageCache>(x => x.GetRequiredService<RedisImagesCache>())
.AddSingleton<IReadyExecutor>(x => x.GetRequiredService<RedisImagesCache>())
.AddSingleton<IDataCache, RedisCache>();
svcs.Scan(scan => scan
.FromAssemblyOf<IReadyExecutor>()
.AddClasses(classes => classes.AssignableToAny(

View File

@@ -53,6 +53,7 @@ namespace NadekoBot.Common.Replacements
newEmbedData.Title = Replace(embedData.Title);
newEmbedData.Thumbnail = Replace(embedData.Thumbnail);
newEmbedData.Image = Replace(embedData.Image);
newEmbedData.Url = Replace(embedData.Url);
if (embedData.Author != null)
{
newEmbedData.Author = new SmartTextEmbedAuthor();

View File

@@ -48,6 +48,7 @@ namespace NadekoBot.Db
private static IQueryable<GuildConfig> IncludeEverything(this DbSet<GuildConfig> configs)
{
// todo split query
return configs
.AsQueryable()
.Include(gc => gc.CommandCooldowns)
@@ -117,9 +118,18 @@ namespace NadekoBot.Db
{
var logSetting = ctx.LogSettings
.AsQueryable()
.Include(x => x.IgnoredChannels)
.Include(x => x.LogIgnores)
.Where(x => x.GuildId == guildId)
.FirstOrDefault();
if (logSetting is null)
{
ctx.LogSettings.Add(logSetting = new ()
{
GuildId = guildId
});
ctx.SaveChanges();
}
return logSetting;
}

View File

@@ -1,8 +0,0 @@
namespace NadekoBot.Services.Database.Models
{
public class IgnoredLogChannel : DbEntity
{
public LogSetting LogSetting { get; set; }
public ulong ChannelId { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
namespace NadekoBot.Services.Database.Models
{
public class IgnoredLogItem : DbEntity
{
public int LogSettingId { get; set; }
public LogSetting LogSetting { get; set; }
public ulong LogItemId { get; set; }
public IgnoredItemType ItemType { get; set; }
}
public enum IgnoredItemType
{
Channel,
User,
}
}

View File

@@ -4,8 +4,7 @@ namespace NadekoBot.Services.Database.Models
{
public class LogSetting : DbEntity
{
public HashSet<IgnoredLogChannel> IgnoredChannels { get; set; } = new HashSet<IgnoredLogChannel>();
public HashSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceChannelIds { get; set; } = new HashSet<IgnoredVoicePresenceChannel>();
public List<IgnoredLogItem> LogIgnores { get; set; } = new List<IgnoredLogItem>();
public ulong GuildId { get; set; }
public ulong? LogOtherId { get; set; }

View File

@@ -42,8 +42,8 @@ namespace NadekoBot.Services.Database
//logging
public DbSet<LogSetting> LogSettings { get; set; }
public DbSet<IgnoredLogChannel> IgnoredLogChannels { get; set; }
public DbSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceCHannels { get; set; }
public DbSet<IgnoredLogItem> IgnoredLogChannels { get; set; }
public DbSet<RotatingPlayingStatus> RotatingStatus { get; set; }
public DbSet<BlacklistEntry> Blacklist { get; set; }
@@ -342,6 +342,15 @@ namespace NadekoBot.Services.Database
modelBuilder.Entity<LogSetting>(ls => ls
.HasIndex(x => x.GuildId)
.IsUnique());
modelBuilder.Entity<LogSetting>(ls => ls
.HasMany(x => x.LogIgnores)
.WithOne(x => x.LogSetting)
.OnDelete(DeleteBehavior.Cascade));
modelBuilder.Entity<IgnoredLogItem>(ili => ili
.HasIndex(x => new { x.LogSettingId, x.LogItemId, x.ItemType })
.IsUnique());
#endregion

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,97 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class logignoreuserchannel : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("DELETE FROM IgnoredLogChannels WHERE LogSettingId is NULL");
migrationBuilder.DropForeignKey(
name: "FK_IgnoredLogChannels_LogSettings_LogSettingId",
table: "IgnoredLogChannels");
migrationBuilder.DropIndex(
name: "IX_IgnoredLogChannels_LogSettingId",
table: "IgnoredLogChannels");
migrationBuilder.RenameColumn(
name: "ChannelId",
table: "IgnoredLogChannels",
newName: "LogItemId");
migrationBuilder.AlterColumn<int>(
name: "LogSettingId",
table: "IgnoredLogChannels",
type: "INTEGER",
nullable: false,
defaultValue: 0,
oldClrType: typeof(int),
oldType: "INTEGER",
oldNullable: true);
migrationBuilder.AddColumn<int>(
name: "ItemType",
table: "IgnoredLogChannels",
type: "INTEGER",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateIndex(
name: "IX_IgnoredLogChannels_LogSettingId_LogItemId_ItemType",
table: "IgnoredLogChannels",
columns: new[] { "LogSettingId", "LogItemId", "ItemType" },
unique: true);
migrationBuilder.AddForeignKey(
name: "FK_IgnoredLogChannels_LogSettings_LogSettingId",
table: "IgnoredLogChannels",
column: "LogSettingId",
principalTable: "LogSettings",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_IgnoredLogChannels_LogSettings_LogSettingId",
table: "IgnoredLogChannels");
migrationBuilder.DropIndex(
name: "IX_IgnoredLogChannels_LogSettingId_LogItemId_ItemType",
table: "IgnoredLogChannels");
migrationBuilder.DropColumn(
name: "ItemType",
table: "IgnoredLogChannels");
migrationBuilder.RenameColumn(
name: "LogItemId",
table: "IgnoredLogChannels",
newName: "ChannelId");
migrationBuilder.AlterColumn<int>(
name: "LogSettingId",
table: "IgnoredLogChannels",
type: "INTEGER",
nullable: true,
oldClrType: typeof(int),
oldType: "INTEGER");
migrationBuilder.CreateIndex(
name: "IX_IgnoredLogChannels_LogSettingId",
table: "IgnoredLogChannels",
column: "LogSettingId");
migrationBuilder.AddForeignKey(
name: "FK_IgnoredLogChannels_LogSettings_LogSettingId",
table: "IgnoredLogChannels",
column: "LogSettingId",
principalTable: "LogSettings",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}

View File

@@ -187,29 +187,6 @@ namespace NadekoBot.Migrations
b.ToTable("FollowedStream");
});
modelBuilder.Entity("NadekoBot.Services.Database.ImageOnlyChannel", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<ulong>("ChannelId")
.HasColumnType("INTEGER");
b.Property<DateTime?>("DateAdded")
.HasColumnType("TEXT");
b.Property<ulong>("GuildId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("ChannelId")
.IsUnique();
b.ToTable("ImageOnlyChannels");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiAltSetting", b =>
{
b.Property<int>("Id")
@@ -870,24 +847,28 @@ namespace NadekoBot.Migrations
b.ToTable("GuildConfigs");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b =>
modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<ulong>("ChannelId")
.HasColumnType("INTEGER");
b.Property<DateTime?>("DateAdded")
.HasColumnType("TEXT");
b.Property<int?>("LogSettingId")
b.Property<int>("ItemType")
.HasColumnType("INTEGER");
b.Property<ulong>("LogItemId")
.HasColumnType("INTEGER");
b.Property<int>("LogSettingId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("LogSettingId");
b.HasIndex("LogSettingId", "LogItemId", "ItemType")
.IsUnique();
b.ToTable("IgnoredLogChannels");
});
@@ -914,6 +895,29 @@ namespace NadekoBot.Migrations
b.ToTable("IgnoredVoicePresenceCHannels");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ImageOnlyChannel", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<ulong>("ChannelId")
.HasColumnType("INTEGER");
b.Property<DateTime?>("DateAdded")
.HasColumnType("TEXT");
b.Property<ulong>("GuildId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("ChannelId")
.IsUnique();
b.ToTable("ImageOnlyChannels");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b =>
{
b.Property<int>("Id")
@@ -2269,11 +2273,13 @@ namespace NadekoBot.Migrations
b.Navigation("GuildConfig");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b =>
modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogItem", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
.WithMany("IgnoredChannels")
.HasForeignKey("LogSettingId");
.WithMany("LogIgnores")
.HasForeignKey("LogSettingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("LogSetting");
});
@@ -2281,7 +2287,7 @@ namespace NadekoBot.Migrations
modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
.WithMany("IgnoredVoicePresenceChannelIds")
.WithMany()
.HasForeignKey("LogSettingId");
b.Navigation("LogSetting");
@@ -2598,9 +2604,7 @@ namespace NadekoBot.Migrations
modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b =>
{
b.Navigation("IgnoredChannels");
b.Navigation("IgnoredVoicePresenceChannelIds");
b.Navigation("LogIgnores");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b =>

View File

@@ -16,6 +16,7 @@ namespace NadekoBot.Modules.Administration
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task AutoAssignRole([Leftover] IRole role)
{
var guser = (IGuildUser) ctx.User;
@@ -47,6 +48,7 @@ namespace NadekoBot.Modules.Administration
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task AutoAssignRole()
{
if (!_service.TryGetRoles(ctx.Guild.Id, out var roles))

View File

@@ -7,6 +7,7 @@ using NadekoBot.Services.Database.Models;
using NadekoBot.Extensions;
using NadekoBot.Modules.Administration.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
@@ -18,12 +19,6 @@ namespace NadekoBot.Modules.Administration
[NoPublicBot]
public class LogCommands : NadekoSubmodule<ILogCommandService>
{
public enum EnableDisable
{
Enable,
Disable
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)]
@@ -43,14 +38,51 @@ namespace NadekoBot.Modules.Administration
[OwnerOnly]
public async Task LogIgnore()
{
var channel = (ITextChannel)ctx.Channel;
var settings = _service.GetGuildLogSettings(ctx.Guild.Id);
var removed = _service.LogIgnore(ctx.Guild.Id, ctx.Channel.Id);
var chs = settings?.LogIgnores.Where(x => x.ItemType == IgnoredItemType.Channel).ToList()
?? new List<IgnoredLogItem>();
var usrs = settings?.LogIgnores.Where(x => x.ItemType == IgnoredItemType.User).ToList()
?? new List<IgnoredLogItem>();
var eb = _eb.Create(ctx)
.WithOkColor()
.AddField(GetText(strs.log_ignored_channels),
chs.Count == 0 ? "-" : string.Join('\n', chs.Select(x => $"{x.LogItemId} | <#{x.LogItemId}>")))
.AddField(GetText(strs.log_ignored_users),
usrs.Count == 0 ? "-" : string.Join('\n', usrs.Select(x => $"{x.LogItemId} | <@{x.LogItemId}>")));
await ctx.Channel.EmbedAsync(eb);
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogIgnore([Leftover]ITextChannel target)
{
target ??= (ITextChannel)ctx.Channel;
var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.Channel);
if (!removed)
await ReplyConfirmLocalizedAsync(strs.log_ignore(Format.Bold(channel.Mention + "(" + channel.Id + ")"))).ConfigureAwait(false);
await ReplyConfirmLocalizedAsync(strs.log_ignore_chan(Format.Bold(target.Mention + "(" + target.Id + ")"))).ConfigureAwait(false);
else
await ReplyConfirmLocalizedAsync(strs.log_not_ignore(Format.Bold(channel.Mention + "(" + channel.Id + ")"))).ConfigureAwait(false);
await ReplyConfirmLocalizedAsync(strs.log_not_ignore_chan(Format.Bold(target.Mention + "(" + target.Id + ")"))).ConfigureAwait(false);
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogIgnore([Leftover]IUser target)
{
var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.User);
if (!removed)
await ReplyConfirmLocalizedAsync(strs.log_ignore_user(Format.Bold(target.Mention + "(" + target.Id + ")"))).ConfigureAwait(false);
else
await ReplyConfirmLocalizedAsync(strs.log_not_ignore_user(Format.Bold(target.Mention + "(" + target.Id + ")"))).ConfigureAwait(false);
}
[NadekoCommand, Aliases]

View File

@@ -6,6 +6,8 @@ using System.Threading;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
using LinqToDB;
using LinqToDB.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using NadekoBot.Common.Collections;
@@ -21,7 +23,7 @@ namespace NadekoBot.Modules.Administration.Services
{
void AddDeleteIgnore(ulong xId);
Task LogServer(ulong guildId, ulong channelId, bool actionValue);
bool LogIgnore(ulong guildId, ulong channelId);
bool LogIgnore(ulong guildId, ulong itemId, IgnoredItemType itemType);
LogSetting GetGuildLogSettings(ulong guildId);
bool Log(ulong guildId, ulong? channelId, LogType type);
}
@@ -37,7 +39,7 @@ namespace NadekoBot.Modules.Administration.Services
return Task.CompletedTask;
}
public bool LogIgnore(ulong guildId, ulong channelId)
public bool LogIgnore(ulong guildId, ulong itemId, IgnoredItemType itemType)
{
return false;
}
@@ -97,7 +99,7 @@ namespace NadekoBot.Modules.Administration.Services
.AsQueryable()
.AsNoTracking()
.Where(x => guildIds.Contains(x.GuildId))
.Include(ls => ls.IgnoredChannels)
.Include(ls => ls.LogIgnores)
.ToList();
GuildLogSettings = configs
@@ -165,21 +167,23 @@ namespace NadekoBot.Modules.Administration.Services
_ignoreMessageIds.Add(messageId);
}
public bool LogIgnore(ulong gid, ulong cid)
public bool LogIgnore(ulong gid, ulong itemId, IgnoredItemType itemType)
{
int removed = 0;
using (var uow = _db.GetDbContext())
{
var logSetting = uow.LogSettingsFor(gid);
removed = logSetting.IgnoredChannels.RemoveWhere(ilc => ilc.ChannelId == cid);
removed = logSetting.LogIgnores
.RemoveAll(x => x.ItemType == itemType && itemId == x.LogItemId);
if (removed == 0)
{
var toAdd = new IgnoredLogChannel {ChannelId = cid};
logSetting.IgnoredChannels.Add(toAdd);
var toAdd = new IgnoredLogItem { LogItemId = itemId, ItemType = itemType};
logSetting.LogIgnores.Add(toAdd);
}
GuildLogSettings.AddOrUpdate(gid, logSetting, (_, _) => logSetting);
uow.SaveChanges();
GuildLogSettings.AddOrUpdate(gid, logSetting, (_, _) => logSetting);
}
return removed > 0;
@@ -580,7 +584,8 @@ namespace NadekoBot.Modules.Administration.Services
{
try
{
if (!GuildLogSettings.TryGetValue(before.Guild.Id, out LogSetting logSetting))
if (!GuildLogSettings.TryGetValue(before.Guild.Id, out LogSetting logSetting)
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == after.Id && ilc.ItemType == IgnoredItemType.User))
return;
ITextChannel logChannel;
@@ -682,7 +687,7 @@ namespace NadekoBot.Modules.Administration.Services
if (!GuildLogSettings.TryGetValue(before.Guild.Id, out LogSetting logSetting)
|| (logSetting.ChannelUpdatedId is null)
|| logSetting.IgnoredChannels.Any(ilc => ilc.ChannelId == after.Id))
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == after.Id && ilc.ItemType == IgnoredItemType.Channel))
return;
ITextChannel logChannel;
@@ -733,7 +738,7 @@ namespace NadekoBot.Modules.Administration.Services
if (!GuildLogSettings.TryGetValue(ch.Guild.Id, out LogSetting logSetting)
|| (logSetting.ChannelDestroyedId is null)
|| logSetting.IgnoredChannels.Any(ilc => ilc.ChannelId == ch.Id))
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == ch.Id && ilc.ItemType == IgnoredItemType.Channel))
return;
ITextChannel logChannel;
@@ -772,7 +777,7 @@ namespace NadekoBot.Modules.Administration.Services
return;
if (!GuildLogSettings.TryGetValue(ch.Guild.Id, out LogSetting logSetting)
|| (logSetting.ChannelCreatedId is null))
|| logSetting.ChannelCreatedId is null)
return;
ITextChannel logChannel;
@@ -817,7 +822,8 @@ namespace NadekoBot.Modules.Administration.Services
return;
if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out LogSetting logSetting)
|| (logSetting.LogVoicePresenceId is null))
|| (logSetting.LogVoicePresenceId is null)
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == iusr.Id && ilc.ItemType == IgnoredItemType.User))
return;
ITextChannel logChannel;
@@ -862,49 +868,6 @@ namespace NadekoBot.Modules.Administration.Services
return Task.CompletedTask;
}
//private Task _client_UserPresenceUpdated(Optional<SocketGuild> optGuild, SocketUser usr, SocketPresence before, SocketPresence after)
//{
// var _ = Task.Run(async () =>
// {
// try
// {
// var guild = optGuild.GetValueOrDefault() ?? (usr as SocketGuildUser)?.Guild;
// if (guild is null)
// return;
// if (!GuildLogSettings.TryGetValue(guild.Id, out LogSetting logSetting)
// || (logSetting.LogUserPresenceId is null)
// || before.Status == after.Status)
// return;
// ITextChannel logChannel;
// if ((logChannel = await TryGetLogChannel(guild, logSetting, LogType.UserPresence)) is null)
// return;
// string str = "";
// if (before.Status != after.Status)
// str = "🎭" + Format.Code(PrettyCurrentTime(g)) +
// GetText(logChannel.Guild, strs.user_status_change(,
// "👤" + Format.Bold(usr.Username),
// Format.Bold(after.Status.ToString()));
// //if (before.Game?.Name != after.Game?.Name)
// //{
// // if (str != "")
// // str += "\n";
// // str += $"👾`{prettyCurrentTime}`👤__**{usr.Username}**__ is now playing **{after.Game?.Name}**.";
// //}
// PresenceUpdates.AddOrUpdate(logChannel, new List<string>() { str }, (id, list) => { list.Add(str); return list; });
// }
// catch
// {
// // ignored
// }
// });
// return Task.CompletedTask;
//}
private Task _client_UserLeft(IGuildUser usr)
{
var _ = Task.Run(async () =>
@@ -912,7 +875,8 @@ namespace NadekoBot.Modules.Administration.Services
try
{
if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out LogSetting logSetting)
|| (logSetting.UserLeftId is null))
|| (logSetting.UserLeftId is null)
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == usr.Id && ilc.ItemType == IgnoredItemType.User))
return;
ITextChannel logChannel;
@@ -987,7 +951,8 @@ namespace NadekoBot.Modules.Administration.Services
try
{
if (!GuildLogSettings.TryGetValue(guild.Id, out LogSetting logSetting)
|| (logSetting.UserUnbannedId is null))
|| (logSetting.UserUnbannedId is null)
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == usr.Id && ilc.ItemType == IgnoredItemType.User))
return;
ITextChannel logChannel;
@@ -1021,7 +986,8 @@ namespace NadekoBot.Modules.Administration.Services
try
{
if (!GuildLogSettings.TryGetValue(guild.Id, out LogSetting logSetting)
|| (logSetting.UserBannedId is null))
|| (logSetting.UserBannedId is null)
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == usr.Id && ilc.ItemType == IgnoredItemType.User))
return;
ITextChannel logChannel;
@@ -1069,7 +1035,7 @@ namespace NadekoBot.Modules.Administration.Services
if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out LogSetting logSetting)
|| (logSetting.MessageDeletedId is null)
|| logSetting.IgnoredChannels.Any(ilc => ilc.ChannelId == channel.Id))
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == channel.Id && ilc.ItemType == IgnoredItemType.Channel))
return;
ITextChannel logChannel;
@@ -1127,7 +1093,7 @@ namespace NadekoBot.Modules.Administration.Services
if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out LogSetting logSetting)
|| (logSetting.MessageUpdatedId is null)
|| logSetting.IgnoredChannels.Any(ilc => ilc.ChannelId == channel.Id))
|| logSetting.LogIgnores.Any(ilc => ilc.LogItemId == channel.Id && ilc.ItemType == IgnoredItemType.Channel))
return;
ITextChannel logChannel;

View File

@@ -1,14 +0,0 @@
namespace NadekoBot.Modules.Gambling.Common.Waifu
{
public struct WaifuProfileTitle
{
public int Count { get; }
public string Title { get; }
public WaifuProfileTitle(int count, string title)
{
Count = count;
Title = title;
}
}
}

View File

@@ -17,11 +17,6 @@ namespace NadekoBot.Modules.Gambling
[Group]
public class CurrencyEventsCommands : GamblingSubmodule<CurrencyEventsService>
{
public enum OtherEvent
{
BotListUpvoters
}
public CurrencyEventsCommands(GamblingConfigService gamblingConf) : base(gamblingConf)
{
}
@@ -37,41 +32,36 @@ namespace NadekoBot.Modules.Gambling
ctx.Channel.Id,
ev,
opts,
GetEmbed
).ConfigureAwait(false))
GetEmbed))
{
await ReplyErrorLocalizedAsync(strs.start_event_fail).ConfigureAwait(false);
return;
}
}
private IEmbedBuilder GetEmbed(CurrencyEvent.Type type, EventOptions opts, long currentPot)
{
switch (type)
return type switch
{
case CurrencyEvent.Type.Reaction:
return _eb.Create()
.WithOkColor()
.WithTitle(GetText(strs.event_title(type.ToString())))
.WithDescription(GetReactionDescription(opts.Amount, currentPot))
.WithFooter(GetText(strs.event_duration_footer(opts.Hours)));
case CurrencyEvent.Type.GameStatus:
return _eb.Create()
.WithOkColor()
.WithTitle(GetText(strs.event_title(type.ToString())))
.WithDescription(GetGameStatusDescription(opts.Amount, currentPot))
.WithFooter(GetText(strs.event_duration_footer(opts.Hours)));
default:
break;
}
throw new ArgumentOutOfRangeException(nameof(type));
CurrencyEvent.Type.Reaction => _eb.Create()
.WithOkColor()
.WithTitle(GetText(strs.event_title(type.ToString())))
.WithDescription(GetReactionDescription(opts.Amount, currentPot))
.WithFooter(GetText(strs.event_duration_footer(opts.Hours))),
CurrencyEvent.Type.GameStatus => _eb.Create()
.WithOkColor()
.WithTitle(GetText(strs.event_title(type.ToString())))
.WithDescription(GetGameStatusDescription(opts.Amount, currentPot))
.WithFooter(GetText(strs.event_duration_footer(opts.Hours))),
_ => throw new ArgumentOutOfRangeException(nameof(type))
};
}
private string GetReactionDescription(long amount, long potSize)
{
string potSizeStr = Format.Bold(potSize == 0
var potSizeStr = Format.Bold(potSize == 0
? "∞" + CurrencySign
: potSize.ToString() + CurrencySign);
: potSize + CurrencySign);
return GetText(strs.new_reaction_event(
CurrencySign,
Format.Bold(amount + CurrencySign),
@@ -80,9 +70,10 @@ namespace NadekoBot.Modules.Gambling
private string GetGameStatusDescription(long amount, long potSize)
{
string potSizeStr = Format.Bold(potSize == 0
var potSizeStr = Format.Bold(potSize == 0
? "∞" + CurrencySign
: potSize.ToString() + CurrencySign);
: potSize + CurrencySign);
return GetText(strs.new_gamestatus_event(
CurrencySign,
Format.Bold(amount + CurrencySign),

View File

@@ -225,6 +225,9 @@ namespace NadekoBot.Modules.Gambling
[BotPerm(GuildPerm.ManageRoles)]
public async Task ShopAdd(Role _, int price, [Leftover] IRole role)
{
if (price < 1)
return;
var entry = new ShopEntry()
{
Name = "-",
@@ -252,8 +255,11 @@ namespace NadekoBot.Modules.Gambling
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)]
public async Task ShopAdd(List _, int price, [Leftover]string name)
public async Task ShopAdd(List _, int price, [Leftover] string name)
{
if (price < 1)
return;
var entry = new ShopEntry()
{
Name = name.TrimTo(100),
@@ -266,13 +272,14 @@ namespace NadekoBot.Modules.Gambling
{
var entries = new IndexedCollection<ShopEntry>(uow.GuildConfigsForId(ctx.Guild.Id,
set => set.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries)
{
entry
};
uow.GuildConfigsForId(ctx.Guild.Id, set => set).ShopEntries = entries;
uow.SaveChanges();
}
await ctx.Channel.EmbedAsync(EntryToEmbed(entry)
.WithTitle(GetText(strs.shop_item_add))).ConfigureAwait(false);
}

View File

@@ -0,0 +1,72 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using NadekoBot.Common;
using NadekoBot.Common.Yml;
using Serilog;
namespace NadekoBot.Modules.Games.Hangman
{
public sealed class DefaultHangmanSource : IHangmanSource
{
private IReadOnlyDictionary<string, HangmanTerm[]> _terms = new Dictionary<string, HangmanTerm[]>();
private readonly Random _rng;
public DefaultHangmanSource()
{
_rng = new NadekoRandom();
Reload();
}
public void Reload()
{
if (!Directory.Exists("data/hangman"))
{
Log.Error("Hangman game won't work. Folder 'data/hangman' is missing.");
return;
}
var qs = new Dictionary<string, HangmanTerm[]>();
foreach (var file in Directory.EnumerateFiles("data/hangman/", "*.yml"))
{
try
{
var data = Yaml.Deserializer.Deserialize<HangmanTerm[]>(File.ReadAllText(file));
qs[Path.GetFileNameWithoutExtension(file).ToLowerInvariant()] = data;
}
catch (Exception ex)
{
Log.Error(ex, "Loading {HangmanFile} failed.", file);
}
}
_terms = qs;
Log.Information("Loaded {HangmanCategoryCount} hangman categories.", qs.Count);
}
public IReadOnlyCollection<string> GetCategories()
=> _terms.Keys.ToList();
public bool GetTerm(string? category, [NotNullWhen(true)] out HangmanTerm? term)
{
if (category is null)
{
var cats = GetCategories();
category = cats.ElementAt(_rng.Next(0, cats.Count));
}
if (_terms.TryGetValue(category, out var terms))
{
term = terms[_rng.Next(0, terms.Length)];
return true;
}
term = null;
return false;
}
}
}

View File

@@ -1,19 +0,0 @@
using System;
namespace NadekoBot.Modules.Games.Common.Hangman.Exceptions
{
public class TermNotFoundException : Exception
{
public TermNotFoundException() : base("Term of that type couldn't be found")
{
}
public TermNotFoundException(string message) : base(message)
{
}
public TermNotFoundException(string message, Exception innerException) : base(message, innerException)
{
}
}
}

View File

@@ -1,170 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NadekoBot.Extensions;
namespace NadekoBot.Modules.Games.Common.Hangman
{
public sealed class Hangman : IDisposable
{
public string TermType { get; }
public TermPool TermPool { get; }
public HangmanObject Term { get; }
public string ScrambledWord => "`" + String.Concat(Term.Word.Select(c =>
{
if (c == ' ')
return " \u2000";
if (!(char.IsLetter(c) || char.IsDigit(c)))
return $" {c}";
c = char.ToLowerInvariant(c);
return _previousGuesses.Contains(c) ? $" {c}" : " ◯";
})) + "`";
private Phase _currentPhase = Phase.Active;
public Phase CurrentPhase
{
get => _currentPhase;
set
{
if (value == Phase.Ended)
_endingCompletionSource.TrySetResult(true);
_currentPhase = value;
}
}
private readonly SemaphoreSlim _locker = new SemaphoreSlim(1, 1);
private readonly HashSet<ulong> _recentUsers = new HashSet<ulong>();
public uint Errors { get; private set; } = 0;
public uint MaxErrors { get; } = 6;
public event Func<Hangman, string, ulong, Task> OnGameEnded = delegate { return Task.CompletedTask; };
public event Func<Hangman, string, char, Task> OnLetterAlreadyUsed = delegate { return Task.CompletedTask; };
public event Func<Hangman, string, char, Task> OnGuessFailed = delegate { return Task.CompletedTask; };
public event Func<Hangman, string, char, Task> OnGuessSucceeded = delegate { return Task.CompletedTask; };
private readonly HashSet<char> _previousGuesses = new HashSet<char>();
public ImmutableArray<char> PreviousGuesses => _previousGuesses.ToImmutableArray();
private readonly TaskCompletionSource<bool> _endingCompletionSource = new TaskCompletionSource<bool>();
public Task EndedTask => _endingCompletionSource.Task;
public Hangman(string type, TermPool tp = null)
{
this.TermType = type.Trim().ToLowerInvariant().ToTitleCase();
this.TermPool = tp ?? new TermPool();
this.Term = this.TermPool.GetTerm(type);
}
private void AddError()
{
if (++Errors > MaxErrors)
{
var _ = OnGameEnded(this, null, 0);
CurrentPhase = Phase.Ended;
}
}
public string GetHangman() => $@". ┌─────┐
.┃...............┋
.┃...............┋
.┃{(Errors > 0 ? ".............😲" : "")}
.{(Errors > 1 ? "............./" : "")} {(Errors > 2 ? "|" : "")} {(Errors > 3 ? "\\" : "")}
.{(Errors > 4 ? "............../" : "")} {(Errors > 5 ? "\\" : "")}
/-\";
public async Task Input(ulong userId, string userName, string input)
{
if (CurrentPhase == Phase.Ended)
return;
if (string.IsNullOrWhiteSpace(input))
return;
input = input.Trim().ToLowerInvariant();
await _locker.WaitAsync().ConfigureAwait(false);
try
{
if (CurrentPhase == Phase.Ended)
return;
if (input.Length > 1) // tried to guess the whole word
{
if (input != Term.Word) // failed
return;
var _ = OnGameEnded?.Invoke(this, userName, userId);
CurrentPhase = Phase.Ended;
return;
}
var ch = input[0];
if (!char.IsLetterOrDigit(ch))
return;
if (!_recentUsers.Add(userId)) // don't let a single user spam guesses
return;
if (!_previousGuesses.Add(ch)) // that letter was already guessed
{
var _ = OnLetterAlreadyUsed?.Invoke(this, userName, ch);
}
else if (!Term.Word.Contains(ch)) // guessed letter doesn't exist
{
var _ = OnGuessFailed?.Invoke(this, userName, ch);
AddError();
}
else if (Term.Word.All(x => _previousGuesses.IsSupersetOf(Term.Word.ToLowerInvariant()
.Where(char.IsLetterOrDigit))))
{
var _ = OnGameEnded.Invoke(this, userName, userId); // if all letters are guessed
CurrentPhase = Phase.Ended;
}
else // guessed but not last letter
{
var _ = OnGuessSucceeded?.Invoke(this, userName, ch);
_recentUsers.Remove(userId); // he can guess again right away
return;
}
var clearSpam = Task.Run(async () =>
{
await Task.Delay(3000).ConfigureAwait(false); // remove the user from the spamlist after 5 seconds
_recentUsers.Remove(userId);
});
}
finally { _locker.Release(); }
}
public async Task Stop()
{
await _locker.WaitAsync().ConfigureAwait(false);
try
{
CurrentPhase = Phase.Ended;
}
finally { _locker.Release(); }
}
public void Dispose()
{
OnGameEnded = null;
OnGuessFailed = null;
OnGuessSucceeded = null;
OnLetterAlreadyUsed = null;
_previousGuesses.Clear();
_recentUsers.Clear();
// _locker.Dispose();
}
}
}

View File

@@ -0,0 +1,122 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AngleSharp.Text;
namespace NadekoBot.Modules.Games.Hangman
{
public sealed class HangmanGame
{
public enum Phase { Running, Ended }
public enum GuessResult { NoAction, AlreadyTried, Incorrect, Guess, Win }
public record State(
int Errors,
Phase Phase,
string Word,
GuessResult GuessResult,
List<char> missedLetters,
string ImageUrl)
{
public bool Failed => Errors > 5;
}
private Phase CurrentPhase { get; set; }
private readonly HashSet<char> _incorrect = new();
private readonly HashSet<char> _correct = new();
private readonly HashSet<char> _remaining = new();
private readonly string _word;
private readonly string _imageUrl;
public HangmanGame(HangmanTerm term)
{
_word = term.Word;
_imageUrl = term.ImageUrl;
_remaining = _word
.ToLowerInvariant()
.Where(x => x.IsLetter())
.Select(char.ToLowerInvariant)
.ToHashSet();
}
public State GetState(GuessResult guessResult = GuessResult.NoAction)
=> new State(_incorrect.Count,
CurrentPhase,
CurrentPhase == Phase.Ended
? _word
: GetScrambledWord(),
guessResult,
_incorrect.ToList(),
CurrentPhase == Phase.Ended
? _imageUrl
: string.Empty);
private string GetScrambledWord()
{
Span<char> output = stackalloc char[_word.Length * 2];
for (var i = 0; i < _word.Length; i++)
{
var ch = _word[i];
if (ch == ' ')
output[i*2] = '';
if (!ch.IsLetter() || !_remaining.Contains(char.ToLowerInvariant(ch)))
output[i*2] = ch;
else
output[i*2] = '_';
output[i * 2 + 1] = ' ';
}
return new(output);
}
// todo lock
public State Guess(string guess)
{
if (CurrentPhase != Phase.Running)
return GetState(GuessResult.NoAction);
guess = guess.Trim();
if (guess.Length > 1)
{
if (guess.Equals(_word, StringComparison.InvariantCultureIgnoreCase))
{
CurrentPhase = Phase.Ended;
return GetState(GuessResult.Win);
}
return GetState(GuessResult.NoAction);
}
var charGuess = guess[0];
if (!char.IsLetter(charGuess))
return GetState(GuessResult.NoAction);
if (_incorrect.Contains(charGuess) || _correct.Contains(charGuess))
return GetState(GuessResult.AlreadyTried);
if (_remaining.Remove(charGuess))
{
if (_remaining.Count == 0)
{
CurrentPhase = Phase.Ended;
return GetState(GuessResult.Win);
}
return GetState(GuessResult.Guess);
}
_incorrect.Add(charGuess);
if (_incorrect.Count > 5)
{
CurrentPhase = Phase.Ended;
return GetState(GuessResult.Incorrect);
}
return GetState(GuessResult.Incorrect);
}
}
}

View File

@@ -1,17 +0,0 @@
using NadekoBot.Extensions;
namespace NadekoBot.Modules.Games.Common.Hangman
{
public class HangmanObject
{
public string Word { get; set; }
public string ImageUrl { get; set; }
public string GetWord()
{
var term = Word.ToTitleCase();
return $"[{term}](https://en.wikipedia.org/wiki/{term.Replace(' ', '_')})";
}
}
}

View File

@@ -0,0 +1,147 @@
#nullable enable
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Discord;
using Microsoft.Extensions.Caching.Memory;
using NadekoBot.Common.ModuleBehaviors;
using NadekoBot.Extensions;
using NadekoBot.Modules.Games.Services;
using NadekoBot.Services;
namespace NadekoBot.Modules.Games.Hangman
{
public sealed class HangmanService : IHangmanService, ILateExecutor
{
private readonly ConcurrentDictionary<ulong, HangmanGame> _hangmanGames = new();
private readonly IHangmanSource _source;
private readonly IEmbedBuilderService _eb;
private readonly GamesConfigService _gcs;
private readonly ICurrencyService _cs;
private readonly IMemoryCache _cdCache;
private readonly object _locker = new();
public HangmanService(IHangmanSource source, IEmbedBuilderService eb, GamesConfigService gcs,
ICurrencyService cs, IMemoryCache cdCache)
{
_source = source;
_eb = eb;
_gcs = gcs;
_cs = cs;
_cdCache = cdCache;
}
public bool StartHangman(
ulong channelId,
string? category,
[NotNullWhen(true)] out HangmanGame.State? state)
{
state = null;
if (!_source.GetTerm(category, out var term))
return false;
var game = new HangmanGame(term);
lock (_locker)
{
var hc = _hangmanGames.GetOrAdd(channelId, game);
if (hc == game)
{
state = hc.GetState();
return true;
}
return false;
}
}
public ValueTask<bool> StopHangman(ulong channelId)
{
lock (_locker)
{
if (_hangmanGames.TryRemove(channelId, out var game))
{
return new(true);
}
}
return new(false);
}
public IReadOnlyCollection<string> GetHangmanTypes()
=> _source.GetCategories();
public async Task LateExecute(IGuild guild, IUserMessage msg)
{
if (_hangmanGames.ContainsKey(msg.Channel.Id))
{
if (string.IsNullOrWhiteSpace(msg.Content))
return;
if (_cdCache.TryGetValue(msg.Author.Id, out _))
return;
HangmanGame.State state;
long rew = 0;
lock (_locker)
{
if (!_hangmanGames.TryGetValue(msg.Channel.Id, out var game))
return;
state = game.Guess(msg.Content.ToLowerInvariant());
if (state.GuessResult == HangmanGame.GuessResult.NoAction)
return;
if (state.GuessResult == HangmanGame.GuessResult.Incorrect
|| state.GuessResult == HangmanGame.GuessResult.AlreadyTried)
{
_cdCache.Set(msg.Author.Id, string.Empty, new MemoryCacheEntryOptions()
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3)
});
}
if (state.Phase == HangmanGame.Phase.Ended)
if (_hangmanGames.TryRemove(msg.Channel.Id, out _))
rew = _gcs.Data.Hangman.CurrencyReward;
}
if (rew > 0)
await _cs.AddAsync(msg.Author, "hangman win", rew, gamble: true);
await SendState((ITextChannel)msg.Channel, msg.Author, msg.Content, state);
}
}
private Task<IUserMessage> SendState(ITextChannel channel, IUser user, string content, HangmanGame.State state)
{
var embed = Games.HangmanCommands.GetEmbed(_eb, state);
if (state.GuessResult == HangmanGame.GuessResult.Guess)
embed.WithDescription($"{user} guessed the letter {content}!")
.WithOkColor();
else if (state.GuessResult == HangmanGame.GuessResult.Incorrect && state.Failed)
embed.WithDescription($"{user} Letter {content} doesn't exist! Game over!")
.WithErrorColor();
else if (state.GuessResult == HangmanGame.GuessResult.Incorrect)
embed.WithDescription($"{user} Letter {content} doesn't exist!")
.WithErrorColor();
else if (state.GuessResult == HangmanGame.GuessResult.AlreadyTried)
embed.WithDescription($"{user} Letter {content} has already been used.")
.WithPendingColor();
else if (state.GuessResult == HangmanGame.GuessResult.Win)
embed.WithDescription($"{user} won!")
.WithOkColor();
if (!string.IsNullOrWhiteSpace(state.ImageUrl)
&& Uri.IsWellFormedUriString(state.ImageUrl, UriKind.Absolute))
{
embed.WithImageUrl(state.ImageUrl);
}
return channel.EmbedAsync(embed);
}
}
}

View File

@@ -0,0 +1,8 @@
namespace NadekoBot.Modules.Games.Hangman
{
public sealed class HangmanTerm
{
public string Word { get; set; }
public string ImageUrl { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
#nullable enable
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Games.Hangman
{
public interface IHangmanService
{
bool StartHangman(ulong channelId, string? category, [NotNullWhen(true)] out HangmanGame.State? hangmanController);
ValueTask<bool> StopHangman(ulong channelId);
IReadOnlyCollection<string> GetHangmanTypes();
}
}

View File

@@ -0,0 +1,14 @@
#nullable enable
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using NadekoBot.Services;
namespace NadekoBot.Modules.Games.Hangman
{
public interface IHangmanSource : INService
{
public IReadOnlyCollection<string> GetCategories();
public void Reload();
public bool GetTerm(string? category, [NotNullWhen(true)] out HangmanTerm? term);
}
}

View File

@@ -1,8 +0,0 @@
namespace NadekoBot.Modules.Games.Common.Hangman
{
public enum Phase
{
Active,
Ended,
}
}

View File

@@ -1,50 +0,0 @@
using NadekoBot.Common;
using NadekoBot.Modules.Games.Common.Hangman.Exceptions;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Serilog;
namespace NadekoBot.Modules.Games.Common.Hangman
{
public class TermPool
{
const string termsPath = "data/hangman.json";
public IReadOnlyDictionary<string, HangmanObject[]> Data { get; } = new Dictionary<string, HangmanObject[]>();
public TermPool()
{
try
{
Data = JsonConvert.DeserializeObject<Dictionary<string, HangmanObject[]>>(File.ReadAllText(termsPath));
Data = Data.ToDictionary(
x => x.Key.ToLowerInvariant(),
x => x.Value);
}
catch (Exception ex)
{
Log.Warning(ex, "Error loading Hangman Term pool");
}
}
public HangmanObject GetTerm(string type)
{
type = type?.Trim().ToLowerInvariant();
var rng = new NadekoRandom();
if (type == "random")
{
type = Data.Keys.ToArray()[rng.Next(0, Data.Keys.Count())];
}
if (!Data.TryGetValue(type, out var termTypes) || termTypes.Length == 0)
throw new TermNotFoundException();
var obj = termTypes[rng.Next(0, termTypes.Length)];
obj.Word = obj.Word.Trim().ToLowerInvariant();
return obj;
}
}
}

View File

@@ -1,14 +0,0 @@
using System;
namespace NadekoBot.Modules.Games.Common.Hangman
{
[Flags]
public enum TermTypes
{
Countries = 0,
Movies = 1,
Animals = 2,
Things = 4,
Random = 8,
}
}

View File

@@ -1,13 +1,10 @@
#nullable enable
using Discord.Commands;
using NadekoBot.Extensions;
using System;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
using NadekoBot.Common.Attributes;
using NadekoBot.Modules.Games.Common.Hangman;
using NadekoBot.Modules.Games.Services;
using NadekoBot.Modules.Games.Common.Hangman.Exceptions;
using NadekoBot.Extensions;
using NadekoBot.Modules.Games.Hangman;
using NadekoBot.Services;
namespace NadekoBot.Modules.Games
@@ -15,136 +12,74 @@ namespace NadekoBot.Modules.Games
public partial class Games
{
[Group]
public class HangmanCommands : NadekoSubmodule<GamesService>
public class HangmanCommands : NadekoSubmodule<IHangmanService>
{
private readonly DiscordSocketClient _client;
private readonly ICurrencyService _cs;
private readonly GamesConfigService _gcs;
public HangmanCommands(DiscordSocketClient client, ICurrencyService cs, GamesConfigService gcs)
{
_client = client;
_cs = cs;
_gcs = gcs;
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Hangmanlist()
{
await SendConfirmAsync(Format.Code(GetText(strs.hangman_types(Prefix)) + "\n" + string.Join("\n", _service.TermPool.Data.Keys)));
await SendConfirmAsync(
GetText(strs.hangman_types(Prefix)),
_service.GetHangmanTypes().JoinWith('\n'));
}
private static string Draw(HangmanGame.State state)
{
return $@". ┌─────┐
.┃...............┋
.┃...............┋
.┃{(state.Errors > 0 ? ".............😲" : "")}
.{(state.Errors > 1 ? "............./" : "")} {(state.Errors > 2 ? "|" : "")} {(state.Errors > 3 ? "\\" : "")}
.{(state.Errors > 4 ? "............../" : "")} {(state.Errors > 5 ? "\\" : "")}
/-\";
}
public static IEmbedBuilder GetEmbed(IEmbedBuilderService eb, HangmanGame.State state)
{
if (state.Phase == HangmanGame.Phase.Running)
return eb.Create()
.WithOkColor()
.AddField("Hangman", Draw(state))
.AddField("Guess", Format.Code(state.Word))
.WithFooter(state.missedLetters.JoinWith(' '));
if (state.Phase == HangmanGame.Phase.Ended && state.Failed)
return eb.Create()
.WithErrorColor()
.AddField("Hangman", Draw(state))
.AddField("Guess", Format.Code(state.Word))
.WithFooter(state.missedLetters.JoinWith(' '));
else
{
return eb.Create()
.WithOkColor()
.AddField("Hangman", Draw(state))
.AddField("Guess", Format.Code(state.Word))
.WithFooter(state.missedLetters.JoinWith(' '));
}
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Hangman([Leftover]string type = "random")
public async Task Hangman([Leftover] string? type = null)
{
Hangman hm;
try
{
hm = new Hangman(type, _service.TermPool);
}
catch (TermNotFoundException)
if (!_service.StartHangman(ctx.Channel.Id, type, out var hangman))
{
await ReplyErrorLocalizedAsync(strs.hangman_running);
return;
}
if (!_service.HangmanGames.TryAdd(ctx.Channel.Id, hm))
{
hm.Dispose();
await ReplyErrorLocalizedAsync(strs.hangman_running).ConfigureAwait(false);
return;
}
hm.OnGameEnded += Hm_OnGameEnded;
hm.OnGuessFailed += Hm_OnGuessFailed;
hm.OnGuessSucceeded += Hm_OnGuessSucceeded;
hm.OnLetterAlreadyUsed += Hm_OnLetterAlreadyUsed;
_client.MessageReceived += _client_MessageReceived;
try
{
await SendConfirmAsync(GetText(strs.hangman_game_started) + $" ({hm.TermType})",
hm.ScrambledWord + "\n" + hm.GetHangman())
.ConfigureAwait(false);
}
catch { }
await hm.EndedTask.ConfigureAwait(false);
_client.MessageReceived -= _client_MessageReceived;
_service.HangmanGames.TryRemove(ctx.Channel.Id, out _);
hm.Dispose();
Task _client_MessageReceived(SocketMessage msg)
{
var _ = Task.Run(() =>
{
if (ctx.Channel.Id == msg.Channel.Id && !msg.Author.IsBot)
return hm.Input(msg.Author.Id, msg.Author.ToString(), msg.Content);
else
return Task.CompletedTask;
});
return Task.CompletedTask;
}
}
Task Hm_OnGameEnded(Hangman game, string winner, ulong userId)
{
if (winner is null)
{
var loseEmbed = _eb.Create().WithTitle($"Hangman Game ({game.TermType}) - Ended")
.WithDescription(Format.Bold("You lose."))
.AddField("It was", game.Term.GetWord())
.WithFooter(string.Join(" ", game.PreviousGuesses))
.WithErrorColor();
if (Uri.IsWellFormedUriString(game.Term.ImageUrl, UriKind.Absolute))
loseEmbed.WithImageUrl(game.Term.ImageUrl);
return ctx.Channel.EmbedAsync(loseEmbed);
}
var reward = _gcs.Data.Hangman.CurrencyReward;
if (reward > 0)
_cs.AddAsync(userId, "hangman win", reward, true);
var winEmbed = _eb.Create().WithTitle($"Hangman Game ({game.TermType}) - Ended")
.WithDescription(Format.Bold($"{winner} Won."))
.AddField("It was", game.Term.GetWord())
.WithFooter(string.Join(" ", game.PreviousGuesses))
.WithOkColor();
if (Uri.IsWellFormedUriString(game.Term.ImageUrl, UriKind.Absolute))
winEmbed.WithImageUrl(game.Term.ImageUrl);
return ctx.Channel.EmbedAsync(winEmbed);
}
private Task Hm_OnLetterAlreadyUsed(Hangman game, string user, char guess)
{
return SendErrorAsync($"Hangman Game ({game.TermType})", $"{user} Letter `{guess}` has already been used. You can guess again in 3 seconds.\n" + game.ScrambledWord + "\n" + game.GetHangman(),
footer: string.Join(" ", game.PreviousGuesses));
}
private Task Hm_OnGuessSucceeded(Hangman game, string user, char guess)
{
return SendConfirmAsync($"Hangman Game ({game.TermType})", $"{user} guessed a letter `{guess}`!\n" + game.ScrambledWord + "\n" + game.GetHangman(),
footer: string.Join(" ", game.PreviousGuesses));
}
private Task Hm_OnGuessFailed(Hangman game, string user, char guess)
{
return SendErrorAsync($"Hangman Game ({game.TermType})", $"{user} Letter `{guess}` does not exist. You can guess again in 3 seconds.\n" + game.ScrambledWord + "\n" + game.GetHangman(),
footer: string.Join(" ", game.PreviousGuesses));
var eb = GetEmbed(_eb, hangman);
eb.WithDescription(GetText(strs.hangman_game_started));
await ctx.Channel.EmbedAsync(eb);
}
[NadekoCommand, Aliases]
[RequireContext(ContextType.Guild)]
public async Task HangmanStop()
{
if (_service.HangmanGames.TryRemove(ctx.Channel.Id, out var removed))
if (await _service.StopHangman(ctx.Channel.Id))
{
await removed.Stop().ConfigureAwait(false);
await ReplyConfirmLocalizedAsync(strs.hangman_stopped).ConfigureAwait(false);
}
}

View File

@@ -4,7 +4,6 @@ using NadekoBot.Services;
using NadekoBot.Extensions;
using NadekoBot.Modules.Games.Common;
using NadekoBot.Modules.Games.Common.Acrophobia;
using NadekoBot.Modules.Games.Common.Hangman;
using NadekoBot.Modules.Games.Common.Nunchi;
using NadekoBot.Modules.Games.Common.Trivia;
using Newtonsoft.Json;
@@ -12,7 +11,6 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
@@ -40,10 +38,6 @@ namespace NadekoBot.Modules.Games.Services
//channelId, game
public ConcurrentDictionary<ulong, AcrophobiaGame> AcrophobiaGames { get; } = new ConcurrentDictionary<ulong, AcrophobiaGame>();
public ConcurrentDictionary<ulong, Hangman> HangmanGames { get; } = new ConcurrentDictionary<ulong, Hangman>();
public TermPool TermPool { get; } = new TermPool();
public ConcurrentDictionary<ulong, TriviaGame> RunningTrivias { get; } = new ConcurrentDictionary<ulong, TriviaGame>();
public Dictionary<ulong, TicTacToe> TicTacToeGames { get; } = new Dictionary<ulong, TicTacToe>();
public ConcurrentDictionary<ulong, TypingGame> RunningContests { get; } = new ConcurrentDictionary<ulong, TypingGame>();

View File

@@ -218,7 +218,7 @@ where ((guildid >> 22) % {_creds.TotalShards}) == {_client.ShardId};")
var channel = _client.GetChannel(repeater.ChannelId) as ITextChannel;
if (channel is null)
channel = await _client.Rest.GetChannelAsync(repeater.ChannelId) as ITextChannel;
try { channel = await _client.Rest.GetChannelAsync(repeater.ChannelId) as ITextChannel; } catch { }
if (channel is null)
{

View File

@@ -93,7 +93,7 @@ namespace NadekoBot.Modules.Utility.Services
return DateTime.UtcNow + (Repeater.Interval * initialIntervalMultiplier);
}
public override bool Equals(object? obj)
public override bool Equals(object obj)
{
return obj is RunningRepeater rr && rr.Repeater.Id == this.Repeater.Id;
}

View File

@@ -123,6 +123,7 @@ namespace NadekoBot.Modules.Xp
[NadekoCommand, Aliases]
[UserPerm(GuildPerm.Administrator)]
[BotPerm(GuildPerm.ManageRoles)]
[RequireContext(ContextType.Guild)]
[Priority(2)]
public async Task XpRoleReward(int level)
@@ -133,6 +134,7 @@ namespace NadekoBot.Modules.Xp
[NadekoCommand, Aliases]
[UserPerm(GuildPerm.Administrator)]
[BotPerm(GuildPerm.ManageRoles)]
[RequireContext(ContextType.Guild)]
[Priority(1)]
public async Task XpRoleReward(int level, AddRemove action, [Leftover] IRole role)

View File

@@ -11,11 +11,12 @@ using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using NadekoBot.Common.ModuleBehaviors;
using Serilog;
namespace NadekoBot.Services
{
public sealed class RedisImagesCache : IImageCache
public sealed class RedisImagesCache : IImageCache, IReadyExecutor
{
private readonly ConnectionMultiplexer _con;
private readonly IBotCredentials _creds;
@@ -73,6 +74,14 @@ namespace NadekoBot.Services
Currency,
}
public async Task OnReadyAsync()
{
if (await AllKeysExist())
return;
await Reload();
}
public RedisImagesCache(ConnectionMultiplexer con, IBotCredentials creds)
{
_con = con;

View File

@@ -5,7 +5,6 @@ using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;
namespace NadekoBot.Services
@@ -20,12 +19,13 @@ namespace NadekoBot.Services
private readonly string _redisKey;
private readonly EndPoint _redisEndpoint;
public RedisCache(ConnectionMultiplexer redis, IBotCredentials creds, DiscordSocketClient client)
public RedisCache(ConnectionMultiplexer redis, IBotCredentials creds,
IImageCache imageCache, ILocalDataCache dataCache)
{
Redis = redis;
_redisEndpoint = Redis.GetEndPoints().First();
LocalImages = new RedisImagesCache(Redis, creds);
LocalData = new RedisLocalDataCache(Redis, creds, client.ShardId);
LocalImages = imageCache;
LocalData = dataCache;
_redisKey = creds.RedisKey();
}

View File

@@ -7,6 +7,8 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Discord;
using Discord.WebSocket;
using Serilog;
namespace NadekoBot.Services
@@ -25,56 +27,33 @@ namespace NadekoBot.Services
public IReadOnlyDictionary<string, SearchPokemon> Pokemons
{
get
{
return Get<Dictionary<string, SearchPokemon>>("pokemon_list");
}
private set
{
Set("pokemon_list", value);
}
get => Get<Dictionary<string, SearchPokemon>>("pokemon_list");
private set => Set("pokemon_list", value);
}
public IReadOnlyDictionary<string, SearchPokemonAbility> PokemonAbilities
{
get
{
return Get<Dictionary<string, SearchPokemonAbility>>("pokemon_abilities");
}
private set
{
Set("pokemon_abilities", value);
}
get => Get<Dictionary<string, SearchPokemonAbility>>("pokemon_abilities");
private set => Set("pokemon_abilities", value);
}
public TriviaQuestion[] TriviaQuestions
{
get
{
return Get<TriviaQuestion[]>("trivia_questions");
}
private set
{
Set("trivia_questions", value);
}
get => Get<TriviaQuestion[]>("trivia_questions");
private set => Set("trivia_questions", value);
}
public IReadOnlyDictionary<int, string> PokemonMap
{
get
{
return Get<Dictionary<int, string>>("pokemon_map");
}
private set
{
Set("pokemon_map", value);
}
get => Get<Dictionary<int, string>>("pokemon_map");
private set => Set("pokemon_map", value);
}
public RedisLocalDataCache(ConnectionMultiplexer con, IBotCredentials creds, int shardId)
public RedisLocalDataCache(ConnectionMultiplexer con, IBotCredentials creds, DiscordSocketClient client)
{
_con = con;
_creds = creds;
var shardId = client.ShardId;
if (shardId == 0)
{

View File

@@ -19,7 +19,7 @@ namespace NadekoBot.Services
private readonly IBotCredentials _creds;
private readonly DateTime _started;
public const string BotVersion = "3.0.4";
public const string BotVersion = "3.0.6";
public string Author => "Kwoth#2452";
public string Library => "Discord.Net";

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,276 @@
- word: Alligator
imageUrl: https://cdn.nadeko.bot/animals/Alligator.jpg
- word: Alpaca
imageUrl: https://cdn.nadeko.bot/animals/Alpaca.jpg
- word: Anaconda
imageUrl: https://cdn.nadeko.bot/animals/Anaconda.jpg
- word: Ant
imageUrl: https://cdn.nadeko.bot/animals/Ant.jpg
- word: Antelope
imageUrl: https://cdn.nadeko.bot/animals/Antelope.jpg
- word: Ape
imageUrl: https://cdn.nadeko.bot/animals/Ape.jpg
- word: Armadillo
imageUrl: https://cdn.nadeko.bot/animals/Armadillo.jpg
- word: Baboon
imageUrl: https://cdn.nadeko.bot/animals/Baboon.jpg
- word: Badger
imageUrl: https://cdn.nadeko.bot/animals/Badger.jpg
- word: Bald Eagle
imageUrl: https://cdn.nadeko.bot/animals/Bald Eagle.jpg
- word: Barracuda
imageUrl: https://cdn.nadeko.bot/animals/Barracuda.jpg
- word: Bat
imageUrl: https://cdn.nadeko.bot/animals/Bat.jpg
- word: Bear
imageUrl: https://cdn.nadeko.bot/animals/Bear.jpg
- word: Beaver
imageUrl: https://cdn.nadeko.bot/animals/Beaver.jpg
- word: Bedbug
imageUrl: https://cdn.nadeko.bot/animals/Bedbug.jpg
- word: Bee
imageUrl: https://cdn.nadeko.bot/animals/Bee.jpg
- word: Beetle
imageUrl: https://cdn.nadeko.bot/animals/Beetle.jpg
- word: Bird
imageUrl: https://cdn.nadeko.bot/animals/Bird.jpg
- word: Bison
imageUrl: https://cdn.nadeko.bot/animals/Bison.jpg
- word: Puma
imageUrl: https://cdn.nadeko.bot/animals/Puma.jpg
- word: Black Widow
imageUrl: https://cdn.nadeko.bot/animals/Black Widow.jpg
- word: Blue Jay
imageUrl: https://cdn.nadeko.bot/animals/Blue Jay.jpg
- word: Blue Whale
imageUrl: https://cdn.nadeko.bot/animals/Blue Whale.jpg
- word: Bobcat
imageUrl: https://cdn.nadeko.bot/animals/Bobcat.jpg
- word: Buffalo
imageUrl: https://cdn.nadeko.bot/animals/Buffalo.jpg
- word: Butterfly
imageUrl: https://cdn.nadeko.bot/animals/Butterfly.jpg
- word: Buzzard
imageUrl: https://cdn.nadeko.bot/animals/Buzzard.jpg
- word: Camel
imageUrl: https://cdn.nadeko.bot/animals/Camel.jpg
- word: Carp
imageUrl: https://cdn.nadeko.bot/animals/Carp.jpg
- word: Cat
imageUrl: https://cdn.nadeko.bot/animals/Cat.jpg
- word: Caterpillar
imageUrl: https://cdn.nadeko.bot/animals/Caterpillar.jpg
- word: Catfish
imageUrl: https://cdn.nadeko.bot/animals/Catfish.jpg
- word: Cheetah
imageUrl: https://cdn.nadeko.bot/animals/Cheetah.jpg
- word: Chicken
imageUrl: https://cdn.nadeko.bot/animals/Chicken.jpg
- word: Chimpanzee
imageUrl: https://cdn.nadeko.bot/animals/Chimpanzee.jpg
- word: Chipmunk
imageUrl: https://cdn.nadeko.bot/animals/Chipmunk.jpg
- word: Cobra
imageUrl: https://cdn.nadeko.bot/animals/Cobra.jpg
- word: Cod
imageUrl: https://cdn.nadeko.bot/animals/Cod.jpg
- word: Condor
imageUrl: https://cdn.nadeko.bot/animals/Condor.jpg
- word: Cougar
imageUrl: https://cdn.nadeko.bot/animals/Cougar.jpg
- word: Cow
imageUrl: https://cdn.nadeko.bot/animals/Cow.jpg
- word: Coyote
imageUrl: https://cdn.nadeko.bot/animals/Coyote.jpg
- word: Crab
imageUrl: https://cdn.nadeko.bot/animals/Crab.jpg
- word: Crane
imageUrl: https://cdn.nadeko.bot/animals/Crane.jpg
- word: Cricket
imageUrl: https://cdn.nadeko.bot/animals/Cricket.jpg
- word: Crocodile
imageUrl: https://cdn.nadeko.bot/animals/Crocodile.jpg
- word: Crow
imageUrl: https://cdn.nadeko.bot/animals/Crow.jpg
- word: Cuckoo
imageUrl: https://cdn.nadeko.bot/animals/Cuckoo.jpg
- word: Deer
imageUrl: https://cdn.nadeko.bot/animals/Deer.jpg
- word: Dinosaur
imageUrl: https://cdn.nadeko.bot/animals/Dinosaur.jpg
- word: Dog
imageUrl: https://cdn.nadeko.bot/animals/Dog.jpg
- word: Dolphin
imageUrl: https://cdn.nadeko.bot/animals/Dolphin.jpg
- word: Donkey
imageUrl: https://cdn.nadeko.bot/animals/Donkey.jpg
- word: Dove
imageUrl: https://cdn.nadeko.bot/animals/Dove.jpg
- word: Dragonfly
imageUrl: https://cdn.nadeko.bot/animals/Dragonfly.jpg
- word: Duck
imageUrl: https://cdn.nadeko.bot/animals/Duck.jpg
- word: Eel
imageUrl: https://cdn.nadeko.bot/animals/Eel.jpg
- word: Elephant
imageUrl: https://cdn.nadeko.bot/animals/Elephant.jpg
- word: Emu
imageUrl: https://cdn.nadeko.bot/animals/Emu.jpg
- word: Falcon
imageUrl: https://cdn.nadeko.bot/animals/Falcon.jpg
- word: Ferret
imageUrl: https://cdn.nadeko.bot/animals/Ferret.jpg
- word: Finch
imageUrl: https://cdn.nadeko.bot/animals/Finch.jpg
- word: Fish
imageUrl: https://cdn.nadeko.bot/animals/Fish.jpg
- word: Flamingo
imageUrl: https://cdn.nadeko.bot/animals/Flamingo.jpg
- word: Flea
imageUrl: https://cdn.nadeko.bot/animals/Flea.jpg
- word: Fly
imageUrl: https://cdn.nadeko.bot/animals/Fly.jpg
- word: Fox
imageUrl: https://cdn.nadeko.bot/animals/Fox.jpg
- word: Frog
imageUrl: https://cdn.nadeko.bot/animals/Frog.jpg
- word: Goat
imageUrl: https://cdn.nadeko.bot/animals/Goat.jpg
- word: Golden Eagle
imageUrl: https://cdn.nadeko.bot/animals/Golden Eagle.jpg
- word: Goose
imageUrl: https://cdn.nadeko.bot/animals/Goose.jpg
- word: Gopher
imageUrl: https://cdn.nadeko.bot/animals/Gopher.jpg
- word: Gorilla
imageUrl: https://cdn.nadeko.bot/animals/Gorilla.jpg
- word: Grasshopper
imageUrl: https://cdn.nadeko.bot/animals/Grasshopper.jpg
- word: Hamster
imageUrl: https://cdn.nadeko.bot/animals/Hamster.jpg
- word: Hare
imageUrl: https://cdn.nadeko.bot/animals/Hare.jpg
- word: Hawk
imageUrl: https://cdn.nadeko.bot/animals/Hawk.jpg
- word: Hippopotamus
imageUrl: https://cdn.nadeko.bot/animals/Hippopotamus.jpg
- word: Horse
imageUrl: https://cdn.nadeko.bot/animals/Horse.jpg
- word: Hummingbird
imageUrl: https://cdn.nadeko.bot/animals/Hummingbird.jpg
- word: Husky
imageUrl: https://cdn.nadeko.bot/animals/Husky.jpg
- word: Iguana
imageUrl: https://cdn.nadeko.bot/animals/Iguana.jpg
- word: Impala
imageUrl: https://cdn.nadeko.bot/animals/Impala.jpg
- word: Kangaroo
imageUrl: https://cdn.nadeko.bot/animals/Kangaroo.jpg
- word: Ladybug
imageUrl: https://cdn.nadeko.bot/animals/Ladybug.jpg
- word: Leopard
imageUrl: https://cdn.nadeko.bot/animals/Leopard.jpg
- word: Lion
imageUrl: https://cdn.nadeko.bot/animals/Lion.jpg
- word: Lizard
imageUrl: https://cdn.nadeko.bot/animals/Lizard.jpg
- word: Llama
imageUrl: https://cdn.nadeko.bot/animals/Llama.jpg
- word: Lobster
imageUrl: https://cdn.nadeko.bot/animals/Lobster.jpg
- word: Mongoose
imageUrl: https://cdn.nadeko.bot/animals/Mongoose.jpg
- word: Monitor lizard
imageUrl: https://cdn.nadeko.bot/animals/Monitor lizard.jpg
- word: Monkey
imageUrl: https://cdn.nadeko.bot/animals/Monkey.jpg
- word: Moose
imageUrl: https://cdn.nadeko.bot/animals/Moose.jpg
- word: Mosquito
imageUrl: https://cdn.nadeko.bot/animals/Mosquito.jpg
- word: Moth
imageUrl: https://cdn.nadeko.bot/animals/Moth.jpg
- word: Mountain goat
imageUrl: https://cdn.nadeko.bot/animals/Mountain goat.jpg
- word: Mouse
imageUrl: https://cdn.nadeko.bot/animals/Mouse.jpg
- word: Mule
imageUrl: https://cdn.nadeko.bot/animals/Mule.jpg
- word: Octopus
imageUrl: https://cdn.nadeko.bot/animals/Octopus.jpg
- word: Orca
imageUrl: https://cdn.nadeko.bot/animals/Orca.jpg
- word: Ostrich
imageUrl: https://cdn.nadeko.bot/animals/Ostrich.jpg
- word: Otter
imageUrl: https://cdn.nadeko.bot/animals/Otter.jpg
- word: Owl
imageUrl: https://cdn.nadeko.bot/animals/Owl.jpg
- word: Ox
imageUrl: https://cdn.nadeko.bot/animals/Ox.jpg
- word: Oyster
imageUrl: https://cdn.nadeko.bot/animals/Oyster.jpg
- word: Panda
imageUrl: https://cdn.nadeko.bot/animals/Panda.jpg
- word: Parrot
imageUrl: https://cdn.nadeko.bot/animals/Parrot.jpg
- word: Peacock
imageUrl: https://cdn.nadeko.bot/animals/Peacock.jpg
- word: Pelican
imageUrl: https://cdn.nadeko.bot/animals/Pelican.jpg
- word: Penguin
imageUrl: https://cdn.nadeko.bot/animals/Penguin.jpg
- word: Perch
imageUrl: https://cdn.nadeko.bot/animals/Perch.jpg
- word: Pheasant
imageUrl: https://cdn.nadeko.bot/animals/Pheasant.jpg
- word: Pig
imageUrl: https://cdn.nadeko.bot/animals/Pig.jpg
- word: Pigeon
imageUrl: https://cdn.nadeko.bot/animals/Pigeon.jpg
- word: Polar bear
imageUrl: https://cdn.nadeko.bot/animals/Polar bear.jpg
- word: Porcupine
imageUrl: https://cdn.nadeko.bot/animals/Porcupine.jpg
- word: Quail
imageUrl: https://cdn.nadeko.bot/animals/Quail.jpg
- word: Rabbit
imageUrl: https://cdn.nadeko.bot/animals/Rabbit.jpg
- word: Raccoon
imageUrl: https://cdn.nadeko.bot/animals/Raccoon.jpg
- word: Rat
imageUrl: https://cdn.nadeko.bot/animals/Rat.jpg
- word: Rattlesnake
imageUrl: https://cdn.nadeko.bot/animals/Rattlesnake.jpg
- word: Raven
imageUrl: https://cdn.nadeko.bot/animals/Raven.jpg
- word: Reindeer
imageUrl: https://cdn.nadeko.bot/animals/Reindeer.jpg
- word: Rooster
imageUrl: https://cdn.nadeko.bot/animals/Rooster.jpg
- word: Sea lion
imageUrl: https://cdn.nadeko.bot/animals/Sea lion.jpg
- word: Seal
imageUrl: https://cdn.nadeko.bot/animals/Seal.jpg
- word: Sheep
imageUrl: https://cdn.nadeko.bot/animals/Sheep.jpg
- word: Shrew
imageUrl: https://cdn.nadeko.bot/animals/Shrew.jpg
- word: Skunk
imageUrl: https://cdn.nadeko.bot/animals/Skunk.jpg
- word: Snail
imageUrl: https://cdn.nadeko.bot/animals/Snail.jpg
- word: Snake
imageUrl: https://cdn.nadeko.bot/animals/Snake.jpg
- word: Spider
imageUrl: https://cdn.nadeko.bot/animals/Spider.jpg
- word: Tiger
imageUrl: https://cdn.nadeko.bot/animals/Tiger.jpg
- word: Walrus
imageUrl: https://cdn.nadeko.bot/animals/Walrus.jpg
- word: Whale
imageUrl: https://cdn.nadeko.bot/animals/Whale.jpg
- word: Wolf
imageUrl: https://cdn.nadeko.bot/animals/Wolf.jpg
- word: Zebra
imageUrl: https://cdn.nadeko.bot/animals/Zebra

View File

@@ -0,0 +1,766 @@
- word: 'Fullmetal Alchemist: Brotherhood'
imageUrl: https://cdn.nadeko.bot/animu/Fullmetal_Alchemist_Brotherhood.jpg
- word: Steins;Gate
imageUrl: https://cdn.nadeko.bot/animu/SteinsGate.jpg
- word: Hunter x Hunter (2011)
imageUrl: https://cdn.nadeko.bot/animu/Hunter_x_Hunter_2011.jpg
- word: Ginga Eiyuu Densetsu
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu.jpg
- word: 'Fruits Basket: The Final'
imageUrl: https://cdn.nadeko.bot/animu/Fruits_Basket_The_Final.jpg
- word: Koe no Katachi
imageUrl: https://cdn.nadeko.bot/animu/Koe_no_Katachi.jpg
- word: 'Clannad: After Story'
imageUrl: https://cdn.nadeko.bot/animu/Clannad_After_Story.jpg
- word: Gintama
imageUrl: https://cdn.nadeko.bot/animu/Gintama.jpg
- word: Kimi no Na wa.
imageUrl: https://cdn.nadeko.bot/animu/Kimi_no_Na_wa..jpg
- word: 'Code Geass: Hangyaku no Lelouch R2'
imageUrl: https://cdn.nadeko.bot/animu/Code_Geass_Hangyaku_no_Lelouch_R2.jpg
- word: 'Haikyuu!!: Karasuno Koukou vs. Shiratorizawa Gakuen Koukou'
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu_Karasuno_Koukou_vs._Shiratorizawa_Gakuen_Koukou.jpg
- word: Mob Psycho 100 II
imageUrl: https://cdn.nadeko.bot/animu/Mob_Psycho_100_II.jpg
- word: 'Kizumonogatari III: Reiketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/Kizumonogatari_III_Reiketsu-hen.jpg
- word: Sen to Chihiro no Kamikakushi
imageUrl: https://cdn.nadeko.bot/animu/Sen_to_Chihiro_no_Kamikakushi.jpg
- word: Violet Evergarden Movie
imageUrl: https://cdn.nadeko.bot/animu/Violet_Evergarden_Movie.jpg
- word: 'Monogatari Series: Second Season'
imageUrl: https://cdn.nadeko.bot/animu/Monogatari_Series_Second_Season.jpg
- word: Monster
imageUrl: https://cdn.nadeko.bot/animu/Monster.jpg
- word: 'Shouwa Genroku Rakugo Shinjuu: Sukeroku Futatabi-hen'
imageUrl: https://cdn.nadeko.bot/animu/Shouwa_Genroku_Rakugo_Shinjuu_Sukeroku_Futatabi-hen.jpg
- word: Cowboy Bebop
imageUrl: https://cdn.nadeko.bot/animu/Cowboy_Bebop.jpg
- word: Jujutsu Kaisen (TV)
imageUrl: https://cdn.nadeko.bot/animu/Jujutsu_Kaisen_TV.jpg
- word: 'Kimetsu no Yaiba Movie: Mugen Ressha-hen'
imageUrl: https://cdn.nadeko.bot/animu/Kimetsu_no_Yaiba_Movie_Mugen_Ressha-hen.jpg
- word: Mushishi Zoku Shou 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Mushishi_Zoku_Shou_2nd_Season.jpg
- word: Hajime no Ippo
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo.jpg
- word: Made in Abyss
imageUrl: https://cdn.nadeko.bot/animu/Made_in_Abyss.jpg
- word: 'Made in Abyss Movie 3: Fukaki Tamashii no Reimei'
imageUrl: https://cdn.nadeko.bot/animu/Made_in_Abyss_Movie_3_Fukaki_Tamashii_no_Reimei.jpg
- word: Mushishi Zoku Shou
imageUrl: https://cdn.nadeko.bot/animu/Mushishi_Zoku_Shou.jpg
- word: 'Rurouni Kenshin: Meiji Kenkaku Romantan - Tsuioku-hen'
imageUrl: https://cdn.nadeko.bot/animu/Rurouni_Kenshin_Meiji_Kenkaku_Romantan_-_Tsuioku-hen.jpg
- word: Shigatsu wa Kimi no Uso
imageUrl: https://cdn.nadeko.bot/animu/Shigatsu_wa_Kimi_no_Uso.jpg
- word: Vinland Saga
imageUrl: https://cdn.nadeko.bot/animu/Vinland_Saga.jpg
- word: 'Code Geass: Hangyaku no Lelouch'
imageUrl: https://cdn.nadeko.bot/animu/Code_Geass_Hangyaku_no_Lelouch.jpg
- word: Great Teacher Onizuka
imageUrl: https://cdn.nadeko.bot/animu/Great_Teacher_Onizuka.jpg
- word: Mononoke Hime
imageUrl: https://cdn.nadeko.bot/animu/Mononoke_Hime.jpg
- word: Mushishi
imageUrl: https://cdn.nadeko.bot/animu/Mushishi.jpg
- word: Haikyuu!! Second Season
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu_Second_Season.jpg
- word: 'Kaguya-sama wa Kokurasetai?: Tensai-tachi no Renai Zunousen'
imageUrl: https://cdn.nadeko.bot/animu/Kaguya-sama_wa_Kokurasetai_Tensai-tachi_no_Renai_Zunousen.jpg
- word: 'Hajime no Ippo: New Challenger'
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo_New_Challenger.jpg
- word: Howl no Ugoku Shiro
imageUrl: https://cdn.nadeko.bot/animu/Howl_no_Ugoku_Shiro.jpg
- word: Natsume Yuujinchou Shi
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Shi.jpg
- word: Seishun Buta Yarou wa Yumemiru Shoujo no Yume wo Minai
imageUrl: https://cdn.nadeko.bot/animu/Seishun_Buta_Yarou_wa_Yumemiru_Shoujo_no_Yume_wo_Minai.jpg
- word: Tengen Toppa Gurren Lagann
imageUrl: https://cdn.nadeko.bot/animu/Tengen_Toppa_Gurren_Lagann.jpg
- word: Violet Evergarden
imageUrl: https://cdn.nadeko.bot/animu/Violet_Evergarden.jpg
- word: Natsume Yuujinchou Roku
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Roku.jpg
- word: Suzumiya Haruhi no Shoushitsu
imageUrl: https://cdn.nadeko.bot/animu/Suzumiya_Haruhi_no_Shoushitsu.jpg
- word: Death Note
imageUrl: https://cdn.nadeko.bot/animu/Death_Note.jpg
- word: Fumetsu no Anata e
imageUrl: https://cdn.nadeko.bot/animu/Fumetsu_no_Anata_e.jpg
- word: 'Mushishi Zoku Shou: Suzu no Shizuku'
imageUrl: https://cdn.nadeko.bot/animu/Mushishi_Zoku_Shou_Suzu_no_Shizuku.jpg
- word: Ookami Kodomo no Ame to Yuki
imageUrl: https://cdn.nadeko.bot/animu/Ookami_Kodomo_no_Ame_to_Yuki.jpg
- word: Ping Pong the Animation
imageUrl: https://cdn.nadeko.bot/animu/Ping_Pong_the_Animation.jpg
- word: Yakusoku no Neverland
imageUrl: https://cdn.nadeko.bot/animu/Yakusoku_no_Neverland.jpg
- word: 'Kizumonogatari II: Nekketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/Kizumonogatari_II_Nekketsu-hen.jpg
- word: Yojouhan Shinwa Taikei
imageUrl: https://cdn.nadeko.bot/animu/Yojouhan_Shinwa_Taikei.jpg
- word: Natsume Yuujinchou San
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_San.jpg
- word: Shouwa Genroku Rakugo Shinjuu
imageUrl: https://cdn.nadeko.bot/animu/Shouwa_Genroku_Rakugo_Shinjuu.jpg
- word: 'Hajime no Ippo: Rising'
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo_Rising.jpg
- word: Kimetsu no Yaiba
imageUrl: https://cdn.nadeko.bot/animu/Kimetsu_no_Yaiba.jpg
- word: Kimi no Suizou wo Tabetai
imageUrl: https://cdn.nadeko.bot/animu/Kimi_no_Suizou_wo_Tabetai.jpg
- word: Natsume Yuujinchou Go
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Go.jpg
- word: Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2
imageUrl: https://cdn.nadeko.bot/animu/ReZero_kara_Hajimeru_Isekai_Seikatsu_2nd_Season_Part_2.jpg
- word: 'Mushishi: Hihamukage'
imageUrl: https://cdn.nadeko.bot/animu/Mushishi_Hihamukage.jpg
- word: Bakuman. 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Bakuman._3rd_Season.jpg
- word: 'Kara no Kyoukai 5: Mujun Rasen'
imageUrl: https://cdn.nadeko.bot/animu/Kara_no_Kyoukai_5_Mujun_Rasen.jpg
- word: Sora yori mo Tooi Basho
imageUrl: https://cdn.nadeko.bot/animu/Sora_yori_mo_Tooi_Basho.jpg
- word: Zoku Natsume Yuujinchou
imageUrl: https://cdn.nadeko.bot/animu/Zoku_Natsume_Yuujinchou.jpg
- word: One Piece
imageUrl: https://cdn.nadeko.bot/animu/One_Piece.jpg
- word: Yuru Camp△ Season 2
imageUrl: https://cdn.nadeko.bot/animu/Yuru_Camp_Season_2.jpg
- word: Fruits Basket 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Fruits_Basket_2nd_Season.jpg
- word: 'Haikyuu!!: To the Top 2nd Season'
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu_To_the_Top_2nd_Season.jpg
- word: 'Koukaku Kidoutai: Stand Alone Complex 2nd GIG'
imageUrl: https://cdn.nadeko.bot/animu/Koukaku_Kidoutai_Stand_Alone_Complex_2nd_GIG.jpg
- word: One Punch Man
imageUrl: https://cdn.nadeko.bot/animu/One_Punch_Man.jpg
- word: 'Neon Genesis Evangelion: The End of Evangelion'
imageUrl: https://cdn.nadeko.bot/animu/Neon_Genesis_Evangelion_The_End_of_Evangelion.jpg
- word: Ansatsu Kyoushitsu 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Ansatsu_Kyoushitsu_2nd_Season.jpg
- word: Slam Dunk
imageUrl: https://cdn.nadeko.bot/animu/Slam_Dunk.jpg
- word: "Vivy: Fluorite Eye's Song"
imageUrl: https://cdn.nadeko.bot/animu/Vivy_Fluorite_Eyes_Song.jpg
- word: 'Rainbow: Nisha Rokubou no Shichinin'
imageUrl: https://cdn.nadeko.bot/animu/Rainbow_Nisha_Rokubou_no_Shichinin.jpg
- word: Shingeki no Kyojin
imageUrl: https://cdn.nadeko.bot/animu/Shingeki_no_Kyojin.jpg
- word: Uchuu Kyoudai
imageUrl: https://cdn.nadeko.bot/animu/Uchuu_Kyoudai.jpg
- word: Aria the Origination
imageUrl: https://cdn.nadeko.bot/animu/Aria_the_Origination.jpg
- word: Holo no Graffiti
imageUrl: https://cdn.nadeko.bot/animu/Holo_no_Graffiti.jpg
- word: Hotaru no Haka
imageUrl: https://cdn.nadeko.bot/animu/Hotaru_no_Haka.jpg
- word: Banana Fish
imageUrl: https://cdn.nadeko.bot/animu/Banana_Fish.jpg
- word: Chihayafuru 3
imageUrl: https://cdn.nadeko.bot/animu/Chihayafuru_3.jpg
- word: Kenpuu Denki Berserk
imageUrl: https://cdn.nadeko.bot/animu/Kenpuu_Denki_Berserk.jpg
- word: Perfect Blue
imageUrl: https://cdn.nadeko.bot/animu/Perfect_Blue.jpg
- word: Samurai Champloo
imageUrl: https://cdn.nadeko.bot/animu/Samurai_Champloo.jpg
- word: Haikyuu!!
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu.jpg
- word: Mo Dao Zu Shi
imageUrl: https://cdn.nadeko.bot/animu/Mo_Dao_Zu_Shi.jpg
- word: Mob Psycho 100
imageUrl: https://cdn.nadeko.bot/animu/Mob_Psycho_100.jpg
- word: Zoku Owarimonogatari
imageUrl: https://cdn.nadeko.bot/animu/Zoku_Owarimonogatari.jpg
- word: Nana
imageUrl: https://cdn.nadeko.bot/animu/Nana.jpg
- word: Nichijou
imageUrl: https://cdn.nadeko.bot/animu/Nichijou.jpg
- word: Saenai Heroine no Sodatekata Fine
imageUrl: https://cdn.nadeko.bot/animu/Saenai_Heroine_no_Sodatekata_Fine.jpg
- word: 'Mushishi Zoku Shou: Odoro no Michi'
imageUrl: https://cdn.nadeko.bot/animu/Mushishi_Zoku_Shou_Odoro_no_Michi.jpg
- word: Owarimonogatari
imageUrl: https://cdn.nadeko.bot/animu/Owarimonogatari.jpg
- word: Saiki Kusuo no Ψ-nan 2
imageUrl: https://cdn.nadeko.bot/animu/Saiki_Kusuo_no_-nan_2.jpg
- word: Yuu☆Yuu☆Hakusho
imageUrl: https://cdn.nadeko.bot/animu/YuuYuuHakusho.jpg
- word: Golden Kamuy 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Golden_Kamuy_3rd_Season.jpg
- word: 'Koukaku Kidoutai: Stand Alone Complex'
imageUrl: https://cdn.nadeko.bot/animu/Koukaku_Kidoutai_Stand_Alone_Complex.jpg
- word: Mo Dao Zu Shi 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Mo_Dao_Zu_Shi_2nd_Season.jpg
- word: Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/ReZero_kara_Hajimeru_Isekai_Seikatsu_2nd_Season.jpg
- word: Sayonara no Asa ni Yakusoku no Hana wo Kazarou
imageUrl: https://cdn.nadeko.bot/animu/Sayonara_no_Asa_ni_Yakusoku_no_Hana_wo_Kazarou.jpg
- word: Mononoke
imageUrl: https://cdn.nadeko.bot/animu/Mononoke.jpg
- word: Saiki Kusuo no Ψ-nan
imageUrl: https://cdn.nadeko.bot/animu/Saiki_Kusuo_no_-nan.jpg
- word: Gotcha!
imageUrl: https://cdn.nadeko.bot/animu/Gotcha.jpg
- word: 'Kara no Kyoukai 7: Satsujin Kousatsu (Go)'
imageUrl: https://cdn.nadeko.bot/animu/Kara_no_Kyoukai_7_Satsujin_Kousatsu_Go.jpg
- word: Kaze ga Tsuyoku Fuiteiru
imageUrl: https://cdn.nadeko.bot/animu/Kaze_ga_Tsuyoku_Fuiteiru.jpg
- word: 3-gatsu no Lion
imageUrl: https://cdn.nadeko.bot/animu/3-gatsu_no_Lion.jpg
- word: Cross Game
imageUrl: https://cdn.nadeko.bot/animu/Cross_Game.jpg
- word: Josee to Tora to Sakana-tachi
imageUrl: https://cdn.nadeko.bot/animu/Josee_to_Tora_to_Sakana-tachi.jpg
- word: Kono Oto Tomare! 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Kono_Oto_Tomare_2nd_Season.jpg
- word: 'Natsume Yuujinchou Movie: Utsusemi ni Musubu'
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Movie_Utsusemi_ni_Musubu.jpg
- word: Yahari Ore no Seishun Love Comedy wa Machigatteiru. Kan
imageUrl: https://cdn.nadeko.bot/animu/Yahari_Ore_no_Seishun_Love_Comedy_wa_Machigatteiru._Kan.jpg
- word: Non Non Biyori Nonstop
imageUrl: https://cdn.nadeko.bot/animu/Non_Non_Biyori_Nonstop.jpg
- word: Usagi Drop
imageUrl: https://cdn.nadeko.bot/animu/Usagi_Drop.jpg
- word: Baccano!
imageUrl: https://cdn.nadeko.bot/animu/Baccano.jpg
- word: Chihayafuru 2
imageUrl: https://cdn.nadeko.bot/animu/Chihayafuru_2.jpg
- word: 'Douluo Dalu: Xiaowu Juebie'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Xiaowu_Juebie.jpg
- word: Grand Blue
imageUrl: https://cdn.nadeko.bot/animu/Grand_Blue.jpg
- word: Houseki no Kuni (TV)
imageUrl: https://cdn.nadeko.bot/animu/Houseki_no_Kuni_TV.jpg
- word: Hunter x Hunter
imageUrl: https://cdn.nadeko.bot/animu/Hunter_x_Hunter.jpg
- word: 'Kaguya-sama wa Kokurasetai: Tensai-tachi no Renai Zunousen'
imageUrl: https://cdn.nadeko.bot/animu/Kaguya-sama_wa_Kokurasetai_Tensai-tachi_no_Renai_Zunousen.jpg
- word: Barakamon
imageUrl: https://cdn.nadeko.bot/animu/Barakamon.jpg
- word: 'Kizumonogatari I: Tekketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/Kizumonogatari_I_Tekketsu-hen.jpg
- word: 'Mushoku Tensei: Isekai Ittara Honki Dasu'
imageUrl: https://cdn.nadeko.bot/animu/Mushoku_Tensei_Isekai_Ittara_Honki_Dasu.jpg
- word: Natsume Yuujinchou Roku Specials
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Roku_Specials.jpg
- word: 'Violet Evergarden Gaiden: Eien to Jidou Shuki Ningyou'
imageUrl: https://cdn.nadeko.bot/animu/Violet_Evergarden_Gaiden_Eien_to_Jidou_Shuki_Ningyou.jpg
- word: Shiguang Daili Ren
imageUrl: https://cdn.nadeko.bot/animu/Shiguang_Daili_Ren.jpg
- word: Tensei shitara Slime Datta Ken 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Tensei_shitara_Slime_Datta_Ken_2nd_Season.jpg
- word: Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai.
imageUrl: https://cdn.nadeko.bot/animu/Ano_Hi_Mita_Hana_no_Namae_wo_Bokutachi_wa_Mada_Shiranai..jpg
- word: 'Cowboy Bebop: Tengoku no Tobira'
imageUrl: https://cdn.nadeko.bot/animu/Cowboy_Bebop_Tengoku_no_Tobira.jpg
- word: Hellsing Ultimate
imageUrl: https://cdn.nadeko.bot/animu/Hellsing_Ultimate.jpg
- word: Kaze no Tani no Nausica
imageUrl: https://cdn.nadeko.bot/animu/Kaze_no_Tani_no_Nausica.jpg
- word: Luo Xiao Hei Zhan Ji (Movie)
imageUrl: https://cdn.nadeko.bot/animu/Luo_Xiao_Hei_Zhan_Ji_Movie.jpg
- word: Bakuman. 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Bakuman._2nd_Season.jpg
- word: 'Kiseijuu: Sei no Kakuritsu'
imageUrl: https://cdn.nadeko.bot/animu/Kiseijuu_Sei_no_Kakuritsu.jpg
- word: 'Kamisama Hajimemashita: Kako-hen'
imageUrl: https://cdn.nadeko.bot/animu/Kamisama_Hajimemashita_Kako-hen.jpg
- word: Kingdom 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Kingdom_2nd_Season.jpg
- word: Kingdom 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Kingdom_3rd_Season.jpg
- word: Mahou Shoujo Madoka Magica
imageUrl: https://cdn.nadeko.bot/animu/Mahou_Shoujo_MadokaMagica.jpg
- word: Psycho-Pass
imageUrl: https://cdn.nadeko.bot/animu/Psycho-Pass.jpg
- word: Tenki no Ko
imageUrl: https://cdn.nadeko.bot/animu/Tenki_no_Ko.jpg
- word: Heaven Official's Blessing
imageUrl: https://cdn.nadeko.bot/animu/Tian_Guan_Ci_Fu.jpg
- word: Uchuu Senkan Yamato 2199
imageUrl: https://cdn.nadeko.bot/animu/Uchuu_Senkan_Yamato_2199.jpg
- word: 'Haikyuu!!: To the Top'
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu_To_the_Top.jpg
- word: Bakemonogatari
imageUrl: https://cdn.nadeko.bot/animu/Bakemonogatari.jpg
- word: Given
imageUrl: https://cdn.nadeko.bot/animu/Given.jpg
- word: Hotarubi no Mori e
imageUrl: https://cdn.nadeko.bot/animu/Hotarubi_no_Mori_e.jpg
- word: Katanagatari
imageUrl: https://cdn.nadeko.bot/animu/Katanagatari.jpg
- word: 'Natsume Yuujinchou: Itsuka Yuki no Hi ni'
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Itsuka_Yuki_no_Hi_ni.jpg
- word: One Outs
imageUrl: https://cdn.nadeko.bot/animu/One_Outs.jpg
- word: Ookami to Koushinryou II
imageUrl: https://cdn.nadeko.bot/animu/Ookami_to_Koushinryou_II.jpg
- word: Romeo no Aoi Sora
imageUrl: https://cdn.nadeko.bot/animu/Romeo_no_Aoi_Sora.jpg
- word: Sakamichi no Apollon
imageUrl: https://cdn.nadeko.bot/animu/Sakamichi_no_Apollon.jpg
- word: Seishun Buta Yarou wa Bunny Girl Senpai no Yume wo Minai
imageUrl: https://cdn.nadeko.bot/animu/Seishun_Buta_Yarou_wa_Bunny_Girl_Senpai_no_Yume_wo_Minai.jpg
- word: Boku dake ga Inai Machi
imageUrl: https://cdn.nadeko.bot/animu/Boku_dake_ga_Inai_Machi.jpg
- word: 'Evangelion: 2.0 You Can (Not) Advance'
imageUrl: https://cdn.nadeko.bot/animu/Evangelion_2.0_You_Can_Not_Advance.jpg
- word: Kemono no Souja Erin
imageUrl: https://cdn.nadeko.bot/animu/Kemono_no_Souja_Erin.jpg
- word: 'Made in Abyss Movie 2: Hourou Suru Tasogare'
imageUrl: https://cdn.nadeko.bot/animu/Made_in_Abyss_Movie_2_Hourou_Suru_Tasogare.jpg
- word: 'Major: World Series'
imageUrl: https://cdn.nadeko.bot/animu/Major_World_Series.jpg
- word: Doukyuusei (Movie)
imageUrl: https://cdn.nadeko.bot/animu/Doukyuusei_Movie.jpg
- word: K-On! Movie
imageUrl: https://cdn.nadeko.bot/animu/K-On_Movie.jpg
- word: Natsume Yuujinchou
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou.jpg
- word: Natsume Yuujinchou Go Specials
imageUrl: https://cdn.nadeko.bot/animu/Natsume_Yuujinchou_Go_Specials.jpg
- word: NHK ni Youkoso!
imageUrl: https://cdn.nadeko.bot/animu/NHK_ni_Youkoso.jpg
- word: Shelter
imageUrl: https://cdn.nadeko.bot/animu/Shelter.jpg
- word: Shinsekai yori
imageUrl: https://cdn.nadeko.bot/animu/Shinsekai_yori.jpg
- word: Shirobako
imageUrl: https://cdn.nadeko.bot/animu/Shirobako.jpg
- word: Versailles no Bara
imageUrl: https://cdn.nadeko.bot/animu/Versailles_no_Bara.jpg
- word: Neon Genesis Evangelion
imageUrl: https://cdn.nadeko.bot/animu/Neon_Genesis_Evangelion.jpg
- word: Dr. Stone
imageUrl: https://cdn.nadeko.bot/animu/Dr._Stone.jpg
- word: Fate/Zero
imageUrl: https://cdn.nadeko.bot/animu/FateZero.jpg
- word: Great Pretender
imageUrl: https://cdn.nadeko.bot/animu/Great_Pretender.jpg
- word: 'Hunter x Hunter: Original Video Animation'
imageUrl: https://cdn.nadeko.bot/animu/Hunter_x_Hunter_Original_Video_Animation.jpg
- word: 'Kino no Tabi: The Beautiful World'
imageUrl: https://cdn.nadeko.bot/animu/Kino_no_Tabi_The_Beautiful_World.jpg
- word: Kuroko no Basket 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Kuroko_no_Basket_3rd_Season.jpg
- word: Bakemono no Ko
imageUrl: https://cdn.nadeko.bot/animu/Bakemono_no_Ko.jpg
- word: Beck
imageUrl: https://cdn.nadeko.bot/animu/Beck.jpg
- word: 'Diamond no Ace: Second Season'
imageUrl: https://cdn.nadeko.bot/animu/Diamond_no_Ace_Second_Season.jpg
- word: Nodame Cantabile
imageUrl: https://cdn.nadeko.bot/animu/Nodame_Cantabile.jpg
- word: 'Rurouni Kenshin: Meiji Kenkaku Romantan'
imageUrl: https://cdn.nadeko.bot/animu/Rurouni_Kenshin_Meiji_Kenkaku_Romantan.jpg
- word: 'Tsubasa: Tokyo Revelations'
imageUrl: https://cdn.nadeko.bot/animu/Tsubasa_Tokyo_Revelations.jpg
- word: 'Violet Evergarden: Kitto "Ai" wo Shiru Hi ga Kuru no Darou'
imageUrl: https://cdn.nadeko.bot/animu/Violet_Evergarden_Kitto_Ai_wo_Shiru_Hi_ga_Kuru_no_Darou.jpg
- word: Planetes
imageUrl: https://cdn.nadeko.bot/animu/Planetes.jpg
- word: 'Stranger: Mukou Hadan'
imageUrl: https://cdn.nadeko.bot/animu/Stranger_Mukou_Hadan.jpg
- word: Yuukoku no Moriarty 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Yuukoku_no_Moriarty_2nd_Season.jpg
- word: Gin no Saji 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Gin_no_Saji_2nd_Season.jpg
- word: Hibike! Euphonium 2
imageUrl: https://cdn.nadeko.bot/animu/Hibike_Euphonium_2.jpg
- word: Initial D First Stage
imageUrl: https://cdn.nadeko.bot/animu/Initial_D_First_Stage.jpg
- word: Kawaki wo Ameku
imageUrl: https://cdn.nadeko.bot/animu/Kawaki_wo_Ameku.jpg
- word: Koukaku Kidoutai
imageUrl: https://cdn.nadeko.bot/animu/Koukaku_Kidoutai.jpg
- word: Redline
imageUrl: https://cdn.nadeko.bot/animu/Redline.jpg
- word: Tenkuu no Shiro Laputa
imageUrl: https://cdn.nadeko.bot/animu/Tenkuu_no_Shiro_Laputa.jpg
- word: Tokyo Godfathers
imageUrl: https://cdn.nadeko.bot/animu/Tokyo_Godfathers.jpg
- word: Tonari no Totoro
imageUrl: https://cdn.nadeko.bot/animu/Tonari_no_Totoro.jpg
- word: 'No Game No Life: Zero'
imageUrl: https://cdn.nadeko.bot/animu/No_Game_No_Life_Zero.jpg
- word: 'Nomad: Megalo Box 2'
imageUrl: https://cdn.nadeko.bot/animu/Nomad_Megalo_Box_2.jpg
- word: Quanzhi Gaoshou Specials
imageUrl: https://cdn.nadeko.bot/animu/Quanzhi_Gaoshou_Specials.jpg
- word: Ashita no Joe
imageUrl: https://cdn.nadeko.bot/animu/Ashita_no_Joe.jpg
- word: 'Douluo Dalu: Xingdou Xian Ji Pian'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Xingdou_Xian_Ji_Pian.jpg
- word: 'Gyakkyou Burai Kaiji: Ultimate Survivor'
imageUrl: https://cdn.nadeko.bot/animu/Gyakkyou_Burai_Kaiji_Ultimate_Survivor.jpg
- word: 'Hajime no Ippo: Champion Road'
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo_Champion_Road.jpg
- word: 'Hunter x Hunter: Greed Island Final'
imageUrl: https://cdn.nadeko.bot/animu/Hunter_x_Hunter_Greed_Island_Final.jpg
- word: Re:Zero kara Hajimeru Isekai Seikatsu
imageUrl: https://cdn.nadeko.bot/animu/ReZero_kara_Hajimeru_Isekai_Seikatsu.jpg
- word: Sennen Joyuu
imageUrl: https://cdn.nadeko.bot/animu/Sennen_Joyuu.jpg
- word: Stand By Me Doraemon 2
imageUrl: https://cdn.nadeko.bot/animu/Stand_By_Me_Doraemon_2.jpg
- word: Yuru Camp
imageUrl: https://cdn.nadeko.bot/animu/Yuru_Camp.jpg
- word: 'Nodame Cantabile: Finale'
imageUrl: https://cdn.nadeko.bot/animu/Nodame_Cantabile_Finale.jpg
- word: Ookami to Koushinryou
imageUrl: https://cdn.nadeko.bot/animu/Ookami_to_Koushinryou.jpg
- word: Space Dandy 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/SpaceDandy_2nd_Season.jpg
- word: Youjo Senki Movie
imageUrl: https://cdn.nadeko.bot/animu/Youjo_Senki_Movie.jpg
- word: Boku no Hero Academia 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Boku_no_Hero_Academia_2nd_Season.jpg
- word: Danshi Koukousei no Nichijou
imageUrl: https://cdn.nadeko.bot/animu/Danshi_Koukousei_no_Nichijou.jpg
- word: Kuroko no Basket 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Kuroko_no_Basket_2nd_Season.jpg
- word: 'Magi: The Kingdom of Magic'
imageUrl: https://cdn.nadeko.bot/animu/Magi_The_Kingdom_of_Magic.jpg
- word: 'Douluo Dalu: Hanhai Qian Kun'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Hanhai_Qian_Kun.jpg
- word: 'Gyakkyou Burai Kaiji: Hakairoku-hen'
imageUrl: https://cdn.nadeko.bot/animu/Gyakkyou_Burai_Kaiji_Hakairoku-hen.jpg
- word: Hachimitsu to Clover II
imageUrl: https://cdn.nadeko.bot/animu/Hachimitsu_to_Clover_II.jpg
- word: Horimiya
imageUrl: https://cdn.nadeko.bot/animu/Horimiya.jpg
- word: 'Kuroshitsuji Movie: Book of the Atlantic'
imageUrl: https://cdn.nadeko.bot/animu/Kuroshitsuji_Movie_Book_of_the_Atlantic.jpg
- word: 'Non Non Biyori Movie: Vacation'
imageUrl: https://cdn.nadeko.bot/animu/Non_Non_Biyori_Movie_Vacation.jpg
- word: Wu Liuqi Zhi Zui Qiang Fa Xing Shi
imageUrl: https://cdn.nadeko.bot/animu/Wu_Liuqi_Zhi_Zui_Qiang_Fa_Xing_Shi.jpg
- word: Yahari Ore no Seishun Love Comedy wa Machigatteiru. Zoku
imageUrl: https://cdn.nadeko.bot/animu/Yahari_Ore_no_Seishun_Love_Comedy_wa_Machigatteiru._Zoku.jpg
- word: Shokugeki no Souma
imageUrl: https://cdn.nadeko.bot/animu/Shokugeki_no_Souma.jpg
- word: SKET Dance
imageUrl: https://cdn.nadeko.bot/animu/SKET_Dance.jpg
- word: Wu Liuqi Zhi Xuanwu Guo Pian
imageUrl: https://cdn.nadeko.bot/animu/Wu_Liuqi_Zhi_Xuanwu_Guo_Pian.jpg
- word: xxxHOLiC Kei
imageUrl: https://cdn.nadeko.bot/animu/xxxHOLiC_Kei.jpg
- word: Initial D Final Stage
imageUrl: https://cdn.nadeko.bot/animu/Initial_D_Final_Stage.jpg
- word: 'Diamond no Ace: Act II'
imageUrl: https://cdn.nadeko.bot/animu/Diamond_no_Ace_Act_II.jpg
- word: 'Hajime no Ippo: Mashiba vs. Kimura'
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo_Mashiba_vs._Kimura.jpg
- word: Kono Sekai no Katasumi ni
imageUrl: https://cdn.nadeko.bot/animu/Kono_Sekai_no_Katasumi_ni.jpg
- word: Majo no Takkyuubin
imageUrl: https://cdn.nadeko.bot/animu/Majo_no_Takkyuubin.jpg
- word: Mimi wo Sumaseba
imageUrl: https://cdn.nadeko.bot/animu/Mimi_wo_Sumaseba.jpg
- word: Trigun
imageUrl: https://cdn.nadeko.bot/animu/Trigun.jpg
- word: 'ReLIFE: Kanketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/ReLIFE_Kanketsu-hen.jpg
- word: Toaru Kagaku no Railgun T
imageUrl: https://cdn.nadeko.bot/animu/Toaru_Kagaku_no_Railgun_T.jpg
- word: xxxHOLiC Rou
imageUrl: https://cdn.nadeko.bot/animu/xxxHOLiC_Rou.jpg
- word: Yoru wa Mijikashi Arukeyo Otome
imageUrl: https://cdn.nadeko.bot/animu/Yoru_wa_Mijikashi_Arukeyo_Otome.jpg
- word: Bakuman.
imageUrl: https://cdn.nadeko.bot/animu/Bakuman..jpg
- word: 'Cardcaptor Sakura Movie 2: Fuuin Sareta Card'
imageUrl: https://cdn.nadeko.bot/animu/Cardcaptor_Sakura_Movie_2_Fuuin_Sareta_Card.jpg
- word: Chihayafuru
imageUrl: https://cdn.nadeko.bot/animu/Chihayafuru.jpg
- word: 'Douluo Dalu: Qian Hua Xi Jin'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Qian_Hua_Xi_Jin.jpg
- word: 'Ginga Eiyuu Densetsu: Die Neue These - Seiran 3'
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu_Die_Neue_These_-_Seiran_3.jpg
- word: Kaguya-hime no Monogatari
imageUrl: https://cdn.nadeko.bot/animu/Kaguya-hime_no_Monogatari.jpg
- word: 'Little Busters!: Refrain'
imageUrl: https://cdn.nadeko.bot/animu/Little_Busters_Refrain.jpg
- word: Dororo
imageUrl: https://cdn.nadeko.bot/animu/Dororo.jpg
- word: 'Dr. Stone: Stone Wars'
imageUrl: https://cdn.nadeko.bot/animu/Dr._Stone_Stone_Wars.jpg
- word: 'Fate/stay night: Unlimited Blade Works'
imageUrl: https://cdn.nadeko.bot/animu/Fatestay_night_Unlimited_Blade_Works.jpg
- word: Girls & Panzer Movie
imageUrl: https://cdn.nadeko.bot/animu/Girls__Panzer_Movie.jpg
- word: Golden Kamuy 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Golden_Kamuy_2nd_Season.jpg
- word: Higurashi no Naku Koro ni Kai
imageUrl: https://cdn.nadeko.bot/animu/Higurashi_no_Naku_Koro_ni_Kai.jpg
- word: 'InuYasha: Kanketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/InuYasha_Kanketsu-hen.jpg
- word: 'Saiki Kusuo no Ψ-nan: Kanketsu-hen'
imageUrl: https://cdn.nadeko.bot/animu/Saiki_Kusuo_no_-nan_Kanketsu-hen.jpg
- word: 'One Piece Movie 14: Stampede'
imageUrl: https://cdn.nadeko.bot/animu/One_Piece_Movie_14_Stampede.jpg
- word: 'One Piece: Episode of Merry - Mou Hitori no Nakama no Monogatari'
imageUrl: https://cdn.nadeko.bot/animu/One_Piece_Episode_of_Merry_-_Mou_Hitori_no_Nakama_no_Monogatari.jpg
- word: Shoujo Kakumei Utena
imageUrl: https://cdn.nadeko.bot/animu/Shoujo_Kakumei_Utena.jpg
- word: Ballroom e Youkoso
imageUrl: https://cdn.nadeko.bot/animu/Ballroom_e_Youkoso.jpg
- word: 'Berserk: Ougon Jidai-hen III - Kourin'
imageUrl: https://cdn.nadeko.bot/animu/Berserk_Ougon_Jidai-hen_III_-_Kourin.jpg
- word: Bungou Stray Dogs 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/Bungou_Stray_Dogs_2nd_Season.jpg
- word: 'Douluo Dalu: Haishen Zhi Guang'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Haishen_Zhi_Guang.jpg
- word: Fruits Basket 1st Season
imageUrl: https://cdn.nadeko.bot/animu/Fruits_Basket_1st_Season.jpg
- word: 'Hunter x Hunter: Greed Island'
imageUrl: https://cdn.nadeko.bot/animu/Hunter_x_Hunter_Greed_Island.jpg
- word: Liz to Aoi Tori
imageUrl: https://cdn.nadeko.bot/animu/Liz_to_Aoi_Tori.jpg
- word: Aria the Natural
imageUrl: https://cdn.nadeko.bot/animu/Aria_the_Natural.jpg
- word: Asobi Asobase
imageUrl: https://cdn.nadeko.bot/animu/Asobi_Asobase.jpg
- word: 'Black Lagoon: The Second Barrage'
imageUrl: https://cdn.nadeko.bot/animu/Black_Lagoon_The_Second_Barrage.jpg
- word: Bungou Stray Dogs 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Bungou_Stray_Dogs_3rd_Season.jpg
- word: Death Parade
imageUrl: https://cdn.nadeko.bot/animu/Death_Parade.jpg
- word: 'Digimon Adventure: Last Evolution Kizuna'
imageUrl: https://cdn.nadeko.bot/animu/Digimon_Adventure_Last_Evolution_Kizuna.jpg
- word: Hinamatsuri (TV)
imageUrl: https://cdn.nadeko.bot/animu/Hinamatsuri_TV.jpg
- word: "Kyoukai no Kanata Movie 2: I'll Be Here - Mirai-hen"
imageUrl: https://cdn.nadeko.bot/animu/Kyoukai_no_Kanata_Movie_2_Ill_Be_Here_-_Mirai-hen.jpg
- word: Maison Ikkoku
imageUrl: https://cdn.nadeko.bot/animu/Maison_Ikkoku.jpg
- word: 'Naruto: Shippuuden'
imageUrl: https://cdn.nadeko.bot/animu/Naruto_Shippuuden.jpg
- word: Non Non Biyori Repeat
imageUrl: https://cdn.nadeko.bot/animu/Non_Non_Biyori_Repeat.jpg
- word: Noragami Aragoto
imageUrl: https://cdn.nadeko.bot/animu/Noragami_Aragoto.jpg
- word: Ouran Koukou Host Club
imageUrl: https://cdn.nadeko.bot/animu/Ouran_Koukou_Host_Club.jpg
- word: Senki Zesshou Symphogear XV
imageUrl: https://cdn.nadeko.bot/animu/Senki_Zesshou_Symphogear_XV.jpg
- word: Shoujo Shuumatsu Ryokou
imageUrl: https://cdn.nadeko.bot/animu/Shoujo_Shuumatsu_Ryokou.jpg
- word: Toradora!
imageUrl: https://cdn.nadeko.bot/animu/Toradora.jpg
- word: 'Working!!!: Lord of the Takanashi'
imageUrl: https://cdn.nadeko.bot/animu/Working_Lord_of_the_Takanashi.jpg
- word: Boku no Hero Academia 3rd Season
imageUrl: https://cdn.nadeko.bot/animu/Boku_no_Hero_Academia_3rd_Season.jpg
- word: 'Douluo Dalu: Jingying Sai'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Jingying_Sai.jpg
- word: 5-toubun no Hanayome ∬
imageUrl: https://cdn.nadeko.bot/animu/5-toubun_no_Hanayome_.jpg
- word: Akira
imageUrl: https://cdn.nadeko.bot/animu/Akira.jpg
- word: Gankutsuou
imageUrl: https://cdn.nadeko.bot/animu/Gankutsuou.jpg
- word: Kamisama Hajimemashita◎
imageUrl: https://cdn.nadeko.bot/animu/Kamisama_Hajimemashita.jpg
- word: 'Lupin III: Part 5'
imageUrl: https://cdn.nadeko.bot/animu/Lupin_III_Part_5.jpg
- word: Mo Dao Zu Shi Q
imageUrl: https://cdn.nadeko.bot/animu/Mo_Dao_Zu_Shi_Q.jpg
- word: Nisemonogatari
imageUrl: https://cdn.nadeko.bot/animu/Nisemonogatari.jpg
- word: 'One Piece Film: Z'
imageUrl: https://cdn.nadeko.bot/animu/One_Piece_Film_Z.jpg
- word: Quanzhi Gaoshou Zhi Dianfeng Rongyao
imageUrl: https://cdn.nadeko.bot/animu/Quanzhi_Gaoshou_Zhi_Dianfeng_Rongyao.jpg
- word: Toki wo Kakeru Shoujo
imageUrl: https://cdn.nadeko.bot/animu/Toki_wo_Kakeru_Shoujo.jpg
- word: No Game No Life
imageUrl: https://cdn.nadeko.bot/animu/No_Game_No_Life.jpg
- word: 'Nodame Cantabile: Paris-hen'
imageUrl: https://cdn.nadeko.bot/animu/Nodame_Cantabile_Paris-hen.jpg
- word: Sakura-sou no Pet na Kanojo
imageUrl: https://cdn.nadeko.bot/animu/Sakura-sou_no_Pet_na_Kanojo.jpg
- word: Seirei no Moribito
imageUrl: https://cdn.nadeko.bot/animu/Seirei_no_Moribito.jpg
- word: 'Shokugeki no Souma: Ni no Sara'
imageUrl: https://cdn.nadeko.bot/animu/Shokugeki_no_Souma_Ni_no_Sara.jpg
- word: Cardcaptor Sakura
imageUrl: https://cdn.nadeko.bot/animu/Cardcaptor_Sakura.jpg
- word: Detective Conan
imageUrl: https://cdn.nadeko.bot/animu/Detective_Conan.jpg
- word: Durarara!!
imageUrl: https://cdn.nadeko.bot/animu/Durarara.jpg
- word: Eizouken ni wa Te wo Dasu na!
imageUrl: https://cdn.nadeko.bot/animu/Eizouken_ni_wa_Te_wo_Dasu_na.jpg
- word: Fate/Grand Carnival
imageUrl: https://cdn.nadeko.bot/animu/FateGrand_Carnival.jpg
- word: Kaiba
imageUrl: https://cdn.nadeko.bot/animu/Kaiba.jpg
- word: Katekyo Hitman Reborn!
imageUrl: https://cdn.nadeko.bot/animu/Katekyo_Hitman_Reborn.jpg
- word: "Mahou Shoujo Lyrical Nanoha: The Movie 2nd A's"
imageUrl: https://cdn.nadeko.bot/animu/Mahou_Shoujo_Lyrical_Nanoha_The_Movie_2nd_As.jpg
- word: Dragon Ball Z
imageUrl: https://cdn.nadeko.bot/animu/Dragon_Ball_Z.jpg
- word: Fullmetal Alchemist
imageUrl: https://cdn.nadeko.bot/animu/Fullmetal_Alchemist.jpg
- word: Ginga Eiyuu Densetsu Gaiden
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu_Gaiden.jpg
- word: Given Movie
imageUrl: https://cdn.nadeko.bot/animu/Given_Movie.jpg
- word: K-On!!
imageUrl: https://cdn.nadeko.bot/animu/K-On.jpg
- word: 'Lupin III: Cagliostro no Shiro'
imageUrl: https://cdn.nadeko.bot/animu/Lupin_III_Cagliostro_no_Shiro.jpg
- word: 'One Piece Film: Strong World'
imageUrl: https://cdn.nadeko.bot/animu/One_Piece_Film_Strong_World.jpg
- word: Tanoshii Muumin Ikka
imageUrl: https://cdn.nadeko.bot/animu/Tanoshii_Muumin_Ikka.jpg
- word: 'One Piece: Episode of Nami - Koukaishi no Namida to Nakama no Kizuna'
imageUrl: https://cdn.nadeko.bot/animu/One_Piece_Episode_of_Nami_-_Koukaishi_no_Namida_to_Nakama_no_Kizuna.jpg
- word: Princess Tutu
imageUrl: https://cdn.nadeko.bot/animu/Princess_Tutu.jpg
- word: Tokyo Revengers
imageUrl: https://cdn.nadeko.bot/animu/Tokyo_Revengers.jpg
- word: Tsuki ga Kirei
imageUrl: https://cdn.nadeko.bot/animu/Tsuki_ga_Kirei.jpg
- word: 'Chuunibyou demo Koi ga Shitai! Movie: Take On Me'
imageUrl: https://cdn.nadeko.bot/animu/Chuunibyou_demo_Koi_ga_Shitai_Movie_Take_On_Me.jpg
- word: 'Douluo Dalu: Hao Tian Yang Wei'
imageUrl: https://cdn.nadeko.bot/animu/Douluo_Dalu_Hao_Tian_Yang_Wei.jpg
- word: 'Honzuki no Gekokujou: Shisho ni Naru Tame ni wa Shudan wo Erandeiraremasen 2nd Season'
imageUrl: https://cdn.nadeko.bot/animu/Honzuki_no_Gekokujou_Shisho_ni_Naru_Tame_ni_wa_Shudan_wo_Erandeiraremasen_2nd_Season.jpg
- word: Initial D Fourth Stage
imageUrl: https://cdn.nadeko.bot/animu/Initial_D_Fourth_Stage.jpg
- word: 'Interstella5555: The 5tory of The 5ecret 5tar 5ystem'
imageUrl: https://cdn.nadeko.bot/animu/Interstella5555_The_5tory_of_The_5ecret_5tar_5ystem.jpg
- word: Kono Subarashii Sekai ni Shukufuku wo!
imageUrl: https://cdn.nadeko.bot/animu/Kono_Subarashii_Sekai_ni_Shukufuku_wo.jpg
- word: 'Made in Abyss Movie 1: Tabidachi no Yoake'
imageUrl: https://cdn.nadeko.bot/animu/Made_in_Abyss_Movie_1_Tabidachi_no_Yoake.jpg
- word: Baccano! Specials
imageUrl: https://cdn.nadeko.bot/animu/Baccano_Specials.jpg
- word: Detroit Metal City
imageUrl: https://cdn.nadeko.bot/animu/Detroit_Metal_City.jpg
- word: Hyouka
imageUrl: https://cdn.nadeko.bot/animu/Hyouka.jpg
- word: Kanata no Astra
imageUrl: https://cdn.nadeko.bot/animu/Kanata_no_Astra.jpg
- word: 'Koukaku Kidoutai: Stand Alone Complex - Solid State Society'
imageUrl: https://cdn.nadeko.bot/animu/Koukaku_Kidoutai_Stand_Alone_Complex_-_Solid_State_Society.jpg
- word: Kuragehime
imageUrl: https://cdn.nadeko.bot/animu/Kuragehime.jpg
- word: 'Mahoutsukai no Yome: Hoshi Matsu Hito'
imageUrl: https://cdn.nadeko.bot/animu/Mahoutsukai_no_Yome_Hoshi_Matsu_Hito.jpg
- word: Mobile Suit Gundam 00
imageUrl: https://cdn.nadeko.bot/animu/Mobile_Suit_Gundam_00.jpg
- word: Tsukimonogatari
imageUrl: https://cdn.nadeko.bot/animu/Tsukimonogatari.jpg
- word: Uchouten Kazoku 2
imageUrl: https://cdn.nadeko.bot/animu/Uchouten_Kazoku_2.jpg
- word: Pui Pui Molcar
imageUrl: https://cdn.nadeko.bot/animu/Pui_Pui_Molcar.jpg
- word: 'Saiki Kusuo no Ψ-nan: Ψ-shidou-hen'
imageUrl: https://cdn.nadeko.bot/animu/Saiki_Kusuo_no_-nan_-shidou-hen.jpg
- word: 'Tsubasa: Shunraiki'
imageUrl: https://cdn.nadeko.bot/animu/Tsubasa_Shunraiki.jpg
- word: Zankyou no Terror
imageUrl: https://cdn.nadeko.bot/animu/Zankyou_no_Terror.jpg
- word: Angel Beats!
imageUrl: https://cdn.nadeko.bot/animu/Angel_Beats.jpg
- word: 'Ginga Eiyuu Densetsu: Arata Naru Tatakai no Overture'
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu_Arata_Naru_Tatakai_no_Overture.jpg
- word: 'IDOLiSH7: Second Beat!'
imageUrl: https://cdn.nadeko.bot/animu/IDOLiSH7_Second_Beat.jpg
- word: Initial D Second Stage
imageUrl: https://cdn.nadeko.bot/animu/Initial_D_Second_Stage.jpg
- word: Kuroko no Basket
imageUrl: https://cdn.nadeko.bot/animu/Kuroko_no_Basket.jpg
- word: Ansatsu Kyoushitsu
imageUrl: https://cdn.nadeko.bot/animu/Ansatsu_Kyoushitsu.jpg
- word: Diamond no Ace
imageUrl: https://cdn.nadeko.bot/animu/Diamond_no_Ace.jpg
- word: 'Dragon Ball Super: Broly'
imageUrl: https://cdn.nadeko.bot/animu/Dragon_Ball_Super_Broly.jpg
- word: 'Haikyuu!! Movie 4: Concept no Tatakai'
imageUrl: https://cdn.nadeko.bot/animu/Haikyuu_Movie_4_Concept_no_Tatakai.jpg
- word: Karakai Jouzu no Takagi-san 2
imageUrl: https://cdn.nadeko.bot/animu/Karakai_Jouzu_no_Takagi-san_2.jpg
- word: Kaze Tachinu
imageUrl: https://cdn.nadeko.bot/animu/Kaze_Tachinu.jpg
- word: Skip Beat!
imageUrl: https://cdn.nadeko.bot/animu/Skip_Beat.jpg
- word: 'Saint Seiya: The Lost Canvas - Meiou Shinwa 2'
imageUrl: https://cdn.nadeko.bot/animu/Saint_Seiya_The_Lost_Canvas_-_Meiou_Shinwa_2.jpg
- word: 'Tamayura: Sotsugyou Shashin Part 4 - Ashita'
imageUrl: https://cdn.nadeko.bot/animu/Tamayura_Sotsugyou_Shashin_Part_4_-_Ashita.jpg
- word: Wonder Egg Priority
imageUrl: https://cdn.nadeko.bot/animu/Wonder_Egg_Priority.jpg
- word: World Trigger 2nd Season
imageUrl: https://cdn.nadeko.bot/animu/World_Trigger_2nd_Season.jpg
- word: 'Yowamushi Pedal: Grande Road'
imageUrl: https://cdn.nadeko.bot/animu/Yowamushi_Pedal_Grande_Road.jpg
- word: 'Darker than Black: Kuro no Keiyakusha'
imageUrl: https://cdn.nadeko.bot/animu/Darker_than_Black_Kuro_no_Keiyakusha.jpg
- word: 'Evangelion: 3.0+1.0 Thrice Upon a Time'
imageUrl: https://cdn.nadeko.bot/animu/Evangelion_3.01.0_Thrice_Upon_a_Time.jpg
- word: Gin no Saji
imageUrl: https://cdn.nadeko.bot/animu/Gin_no_Saji.jpg
- word: 'Hajime no Ippo: Boxer no Kobushi'
imageUrl: https://cdn.nadeko.bot/animu/Hajime_no_Ippo_Boxer_no_Kobushi.jpg
- word: Hikaru no Go
imageUrl: https://cdn.nadeko.bot/animu/Hikaru_no_Go.jpg
- word: 'JoJo no Kimyou na Bouken Part 3: Stardust Crusaders'
imageUrl: https://cdn.nadeko.bot/animu/JoJo_no_Kimyou_na_Bouken_Part_3_Stardust_Crusaders.jpg
- word: 'Kamisama Hajimemashita: Kamisama, Shiawase ni Naru'
imageUrl: https://cdn.nadeko.bot/animu/Kamisama_Hajimemashita_Kamisama_Shiawase_ni_Naru.jpg
- word: 'Kuroko no Basket: Saikou no Present Desu'
imageUrl: https://cdn.nadeko.bot/animu/Kuroko_no_Basket_Saikou_no_Present_Desu.jpg
- word: 'Kuroshitsuji: Book of Circus'
imageUrl: https://cdn.nadeko.bot/animu/Kuroshitsuji_Book_of_Circus.jpg
- word: Akatsuki no Yona OVA
imageUrl: https://cdn.nadeko.bot/animu/Akatsuki_no_Yona_OVA.jpg
- word: Dorohedoro
imageUrl: https://cdn.nadeko.bot/animu/Dorohedoro.jpg
- word: Durarara!!x2 Ketsu
imageUrl: https://cdn.nadeko.bot/animu/Durararax2_Ketsu.jpg
- word: 'Ginga Eiyuu Densetsu: Die Neue These - Seiran 2'
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu_Die_Neue_These_-_Seiran_2.jpg
- word: Gosick
imageUrl: https://cdn.nadeko.bot/animu/Gosick.jpg
- word: 'Hidamari Sketch: Sae Hiro Sotsugyou-hen'
imageUrl: https://cdn.nadeko.bot/animu/Hidamari_Sketch_Sae_Hiro_Sotsugyou-hen.jpg
- word: 'Koukaku Kidoutai: Stand Alone Complex - The Laughing Man'
imageUrl: https://cdn.nadeko.bot/animu/Koukaku_Kidoutai_Stand_Alone_Complex_-_The_Laughing_Man.jpg
- word: 'Kuroshitsuji: Book of Murder'
imageUrl: https://cdn.nadeko.bot/animu/Kuroshitsuji_Book_of_Murder.jpg
- word: Mirai Shounen Conan
imageUrl: https://cdn.nadeko.bot/animu/Mirai_Shounen_Conan.jpg
- word: Omoide no Marnie
imageUrl: https://cdn.nadeko.bot/animu/Omoide_no_Marnie.jpg
- word: Shijou Saikyou no Deshi Kenichi
imageUrl: https://cdn.nadeko.bot/animu/Shijou_Saikyou_no_Deshi_Kenichi.jpg
- word: 'Shokugeki no Souma: San no Sara'
imageUrl: https://cdn.nadeko.bot/animu/Shokugeki_no_Souma_San_no_Sara.jpg
- word: Tensei shitara Slime Datta Ken
imageUrl: https://cdn.nadeko.bot/animu/Tensei_shitara_Slime_Datta_Ken.jpg
- word: 'Ramayana: The Legend of Prince Rama'
imageUrl: https://cdn.nadeko.bot/animu/Ramayana_The_Legend_of_Prince_Rama.jpg
- word: Summer Wars
imageUrl: https://cdn.nadeko.bot/animu/Summer_Wars.jpg
- word: Yuusha-Ou GaoGaiGar Final
imageUrl: https://cdn.nadeko.bot/animu/Yuusha-Ou_GaoGaiGar_Final.jpg
- word: Dennou Coil
imageUrl: https://cdn.nadeko.bot/animu/Dennou_Coil.jpg
- word: Ginga Eiyuu Densetsu Gaiden (1999)
imageUrl: https://cdn.nadeko.bot/animu/Ginga_Eiyuu_Densetsu_Gaiden_1999.jpg
- word: Glass no Kamen (2005)
imageUrl: https://cdn.nadeko.bot/animu/Glass_no_Kamen_2005.jpg
- word: Kill la Kill
imageUrl: https://cdn.nadeko.bot/animu/Kill_la_Kill.jpg
- word: Koukyoushihen Eureka Seven
imageUrl: https://cdn.nadeko.bot/animu/Koukyoushihen_Eureka_Seven.jpg

View File

@@ -0,0 +1,390 @@
- word: Afghanistan
imageUrl: https://cdn.nadeko.bot/flags/af-flag.gif
- word: Albania
imageUrl: https://cdn.nadeko.bot/flags/al-flag.gif
- word: Algeria
imageUrl: https://cdn.nadeko.bot/flags/ag-flag.gif
- word: Andorra
imageUrl: https://cdn.nadeko.bot/flags/an-flag.gif
- word: Angola
imageUrl: https://cdn.nadeko.bot/flags/ao-flag.gif
- word: Antigua and Barbuda
imageUrl: https://cdn.nadeko.bot/flags/ac-flag.gif
- word: Argentina
imageUrl: https://cdn.nadeko.bot/flags/ar-flag.gif
- word: Armenia
imageUrl: https://cdn.nadeko.bot/flags/am-flag.gif
- word: Australia
imageUrl: https://cdn.nadeko.bot/flags/as-flag.gif
- word: Austria
imageUrl: https://cdn.nadeko.bot/flags/au-flag.gif
- word: Azerbaijan
imageUrl: https://cdn.nadeko.bot/flags/aj-flag.gif
- word: Bahamas
imageUrl: https://cdn.nadeko.bot/flags/bf-flag.gif
- word: Bahrain
imageUrl: https://cdn.nadeko.bot/flags/ba-flag.gif
- word: Bangladesh
imageUrl: https://cdn.nadeko.bot/flags/bg-flag.gif
- word: Barbados
imageUrl: https://cdn.nadeko.bot/flags/bb-flag.gif
- word: Belarus
imageUrl: https://cdn.nadeko.bot/flags/bo-flag.gif
- word: Belgium
imageUrl: https://cdn.nadeko.bot/flags/be-flag.gif
- word: Belize
imageUrl: https://cdn.nadeko.bot/flags/bh-flag.gif
- word: Benin
imageUrl: https://cdn.nadeko.bot/flags/bn-flag.gif
- word: Bhutan
imageUrl: https://cdn.nadeko.bot/flags/bt-flag.gif
- word: Bolivia
imageUrl: https://cdn.nadeko.bot/flags/bl-flag.gif
- word: Bosnia and Herzegovina
imageUrl: https://cdn.nadeko.bot/flags/bk-flag.gif
- word: Botswana
imageUrl: https://cdn.nadeko.bot/flags/bc-flag.gif
- word: Brazil
imageUrl: https://cdn.nadeko.bot/flags/br-flag.gif
- word: Brunei
imageUrl: https://cdn.nadeko.bot/flags/bx-flag.gif
- word: Bulgaria
imageUrl: https://cdn.nadeko.bot/flags/bu-flag.gif
- word: Burkina Faso
imageUrl: https://cdn.nadeko.bot/flags/uv-flag.gif
- word: Burundi
imageUrl: https://cdn.nadeko.bot/flags/by-flag.gif
- word: Ivory Coast
imageUrl: https://cdn.nadeko.bot/flags/iv-flag.gif
- word: Cabo Verde
imageUrl: https://cdn.nadeko.bot/flags/cv-flag.gif
- word: Cambodia
imageUrl: https://cdn.nadeko.bot/flags/cb-flag.gif
- word: Cameroon
imageUrl: https://cdn.nadeko.bot/flags/cm-flag.gif
- word: Canada
imageUrl: https://cdn.nadeko.bot/flags/ca-flag.gif
- word: Central African Republic
imageUrl: https://cdn.nadeko.bot/flags/ct-flag.gif
- word: Chad
imageUrl: https://cdn.nadeko.bot/flags/cd-flag.gif
- word: Chile
imageUrl: https://cdn.nadeko.bot/flags/ci-flag.gif
- word: China
imageUrl: https://cdn.nadeko.bot/flags/ch-flag.gif
- word: Colombia
imageUrl: https://cdn.nadeko.bot/flags/co-flag.gif
- word: Comoros
imageUrl: https://cdn.nadeko.bot/flags/cn-flag.gif
- word: Congo
imageUrl: https://cdn.nadeko.bot/flags/cg-flag.gif
- word: Costa Rica
imageUrl: https://cdn.nadeko.bot/flags/cs-flag.gif
- word: Croatia
imageUrl: https://cdn.nadeko.bot/flags/hr-flag.gif
- word: Cuba
imageUrl: https://cdn.nadeko.bot/flags/cu-flag.gif
- word: Cyprus
imageUrl: https://cdn.nadeko.bot/flags/cy-flag.gif
- word: Czechia
imageUrl: https://cdn.nadeko.bot/flags/ez-flag.gif
- word: Denmark
imageUrl: https://cdn.nadeko.bot/flags/da-flag.gif
- word: Djibouti
imageUrl: https://cdn.nadeko.bot/flags/dj-flag.gif
- word: Dominica
imageUrl: https://cdn.nadeko.bot/flags/do-flag.gif
- word: Dominican Republic
imageUrl: https://cdn.nadeko.bot/flags/dr-flag.gif
- word: Democratic People's Republic of Korea
imageUrl: https://cdn.nadeko.bot/flags/kn-flag.gif
- word: Democratic Republic of the Congo
imageUrl: https://cdn.nadeko.bot/flags/congo-flag.gif
- word: Ecuador
imageUrl: https://cdn.nadeko.bot/flags/ec-flag.gif
- word: Egypt
imageUrl: https://cdn.nadeko.bot/flags/eg-flag.gif
- word: El Salvador
imageUrl: https://cdn.nadeko.bot/flags/es-flag.gif
- word: Equatorial Guinea
imageUrl: https://cdn.nadeko.bot/flags/ek-flag.gif
- word: Eritrea
imageUrl: https://cdn.nadeko.bot/flags/er-flag.gif
- word: Estonia
imageUrl: https://cdn.nadeko.bot/flags/en-flag.gif
- word: Eswatini
imageUrl: https://cdn.nadeko.bot/flags/wz-flag.gif
- word: Ethiopia
imageUrl: https://cdn.nadeko.bot/flags/et-flag.gif
- word: Fiji
imageUrl: https://cdn.nadeko.bot/flags/fj-flag.gif
- word: Finland
imageUrl: https://cdn.nadeko.bot/flags/fi-flag.gif
- word: France
imageUrl: https://cdn.nadeko.bot/flags/fr-flag.gif
- word: Gabon
imageUrl: https://cdn.nadeko.bot/flags/gb-flag.gif
- word: Gambia
imageUrl: https://cdn.nadeko.bot/flags/ga-flag.gif
- word: Georgia
imageUrl: https://cdn.nadeko.bot/flags/gg-flag.gif
- word: Germany
imageUrl: https://cdn.nadeko.bot/flags/gm-flag.gif
- word: Ghana
imageUrl: https://cdn.nadeko.bot/flags/gh-flag.gif
- word: Greece
imageUrl: https://cdn.nadeko.bot/flags/gr-flag.gif
- word: Grenada
imageUrl: https://cdn.nadeko.bot/flags/gj-flag.gif
- word: Guatemala
imageUrl: https://cdn.nadeko.bot/flags/gt-flag.gif
- word: Guinea
imageUrl: https://cdn.nadeko.bot/flags/gv-flag.gif
- word: Guinea-Bissau
imageUrl: https://cdn.nadeko.bot/flags/pu-flag.gif
- word: Guyana
imageUrl: https://cdn.nadeko.bot/flags/gy-flag.gif
- word: Haiti
imageUrl: https://cdn.nadeko.bot/flags/ha-flag.gif
- word: Holy See
imageUrl: https://cdn.nadeko.bot/flags/vt-flag.gif
- word: Honduras
imageUrl: https://cdn.nadeko.bot/flags/ho-flag.gif
- word: Hungary
imageUrl: https://cdn.nadeko.bot/flags/hu-flag.gif
- word: Iceland
imageUrl: https://cdn.nadeko.bot/flags/ic-flag.gif
- word: India
imageUrl: https://cdn.nadeko.bot/flags/in-flag.gif
- word: Indonesia
imageUrl: https://cdn.nadeko.bot/flags/id-flag.gif
- word: Iran
imageUrl: https://cdn.nadeko.bot/flags/ir-flag.gif
- word: Iraq
imageUrl: https://cdn.nadeko.bot/flags/iz-flag.gif
- word: Ireland
imageUrl: https://cdn.nadeko.bot/flags/ei-flag.gif
- word: Israel
imageUrl: https://cdn.nadeko.bot/flags/is-flag.gif
- word: Italy
imageUrl: https://cdn.nadeko.bot/flags/it-flag.gif
- word: Jamaica
imageUrl: https://cdn.nadeko.bot/flags/jm-flag.gif
- word: Japan
imageUrl: https://cdn.nadeko.bot/flags/ja-flag.gif
- word: Jordan
imageUrl: https://cdn.nadeko.bot/flags/jo-flag.gif
- word: Kazakhstan
imageUrl: https://cdn.nadeko.bot/flags/kz-flag.gif
- word: Kenya
imageUrl: https://cdn.nadeko.bot/flags/ke-flag.gif
- word: Kiribati
imageUrl: https://cdn.nadeko.bot/flags/kr-flag.gif
- word: Kuwait
imageUrl: https://cdn.nadeko.bot/flags/ku-flag.gif
- word: Kyrgyzstan
imageUrl: https://cdn.nadeko.bot/flags/kg-flag.gif
- word: Laos
imageUrl: https://cdn.nadeko.bot/flags/la-flag.gif
- word: Latvia
imageUrl: https://cdn.nadeko.bot/flags/lg-flag.gif
- word: Lebanon
imageUrl: https://cdn.nadeko.bot/flags/le-flag.gif
- word: Lesotho
imageUrl: https://cdn.nadeko.bot/flags/lt-flag.gif
- word: Liberia
imageUrl: https://cdn.nadeko.bot/flags/li-flag.gif
- word: Libya
imageUrl: https://cdn.nadeko.bot/flags/ly-flag.gif
- word: Liechtenstein
imageUrl: https://cdn.nadeko.bot/flags/ls-flag.gif
- word: Lithuania
imageUrl: https://cdn.nadeko.bot/flags/lh-flag.gif
- word: Luxembourg
imageUrl: https://cdn.nadeko.bot/flags/lu-flag.gif
- word: Madagascar
imageUrl: https://cdn.nadeko.bot/flags/ma-flag.gif
- word: Malawi
imageUrl: https://cdn.nadeko.bot/flags/mi-flag.gif
- word: Malaysia
imageUrl: https://cdn.nadeko.bot/flags/my-flag.gif
- word: Maldives
imageUrl: https://cdn.nadeko.bot/flags/mv-flag.gif
- word: Mali
imageUrl: https://cdn.nadeko.bot/flags/ml-flag.gif
- word: Malta
imageUrl: https://cdn.nadeko.bot/flags/mt-flag.gif
- word: Marshall Islands
imageUrl: https://cdn.nadeko.bot/flags/rm-flag.gif
- word: Mauritania
imageUrl: https://cdn.nadeko.bot/flags/mr-flag.gif
- word: Mauritius
imageUrl: https://cdn.nadeko.bot/flags/mp-flag.gif
- word: Mexico
imageUrl: https://cdn.nadeko.bot/flags/mx-flag.gif
- word: Micronesia
imageUrl: https://cdn.nadeko.bot/flags/fm-flag.gif
- word: Moldova
imageUrl: https://cdn.nadeko.bot/flags/md-flag.gif
- word: Monaco
imageUrl: https://cdn.nadeko.bot/flags/mn-flag.gif
- word: Mongolia
imageUrl: https://cdn.nadeko.bot/flags/mg-flag.gif
- word: Montenegro
imageUrl: https://cdn.nadeko.bot/flags/mj-flag.gif
- word: Morocco
imageUrl: https://cdn.nadeko.bot/flags/mo-flag.gif
- word: Mozambique
imageUrl: https://cdn.nadeko.bot/flags/mz-flag.gif
- word: Myanmar
imageUrl: https://cdn.nadeko.bot/flags/bm-flag.gif
- word: Namibia
imageUrl: https://cdn.nadeko.bot/flags/wa-flag.gif
- word: Nauru
imageUrl: https://cdn.nadeko.bot/flags/nr-flag.gif
- word: Nepal
imageUrl: https://cdn.nadeko.bot/flags/np-flag.gif
- word: Netherlands
imageUrl: https://cdn.nadeko.bot/flags/nl-flag.gif
- word: New Zealand
imageUrl: https://cdn.nadeko.bot/flags/nz-flag.gif
- word: Nicaragua
imageUrl: https://cdn.nadeko.bot/flags/nu-flag.gif
- word: Niger
imageUrl: https://cdn.nadeko.bot/flags/ng-flag.gif
- word: Nigeria
imageUrl: https://cdn.nadeko.bot/flags/ni-flag.gif
- word: North Macedonia
imageUrl: https://cdn.nadeko.bot/flags/mk-flag.gif
- word: Norway
imageUrl: https://cdn.nadeko.bot/flags/no-flag.gif
- word: Oman
imageUrl: https://cdn.nadeko.bot/flags/mu-flag.gif
- word: Pakistan
imageUrl: https://cdn.nadeko.bot/flags/pk-flag.gif
- word: Palau
imageUrl: https://cdn.nadeko.bot/flags/ps-flag.gif
- word: Panama
imageUrl: https://cdn.nadeko.bot/flags/pm-flag.gif
- word: Papua New Guinea
imageUrl: https://cdn.nadeko.bot/flags/pp-flag.gif
- word: Paraguay
imageUrl: https://cdn.nadeko.bot/flags/pa-flag.gif
- word: Peru
imageUrl: https://cdn.nadeko.bot/flags/pe-flag.gif
- word: Philippines
imageUrl: https://cdn.nadeko.bot/flags/rp-flag.gif
- word: Poland
imageUrl: https://cdn.nadeko.bot/flags/pl-flag.gif
- word: Portugal
imageUrl: https://cdn.nadeko.bot/flags/po-flag.gif
- word: Qatar
imageUrl: https://cdn.nadeko.bot/flags/qa-flag.gif
- word: Romania
imageUrl: https://cdn.nadeko.bot/flags/ro-flag.gif
- word: Russia
imageUrl: https://cdn.nadeko.bot/flags/rs-flag.gif
- word: Rwanda
imageUrl: https://cdn.nadeko.bot/flags/rw-flag.gif
- word: Saint Kitts and Nevis
imageUrl: https://cdn.nadeko.bot/flags/sc-flag.gif
- word: Saint Lucia
imageUrl: https://cdn.nadeko.bot/flags/st-flag.gif
- word: Samoa
imageUrl: https://cdn.nadeko.bot/flags/ws-flag.gif
- word: San Marino
imageUrl: https://cdn.nadeko.bot/flags/sm-flag.gif
- word: Sao Tome and Principe
imageUrl: https://cdn.nadeko.bot/flags/tp-flag.gif
- word: Saudi Arabia
imageUrl: https://cdn.nadeko.bot/flags/sa-flag.gif
- word: Senegal
imageUrl: https://cdn.nadeko.bot/flags/sg-flag.gif
- word: Serbia
imageUrl: https://cdn.nadeko.bot/flags/ri-flag.gif
- word: Seychelles
imageUrl: https://cdn.nadeko.bot/flags/se-flag.gif
- word: Sierra Leone
imageUrl: https://cdn.nadeko.bot/flags/sl-flag.gif
- word: Singapore
imageUrl: https://cdn.nadeko.bot/flags/sn-flag.gif
- word: Slovakia
imageUrl: https://cdn.nadeko.bot/flags/lo-flag.gif
- word: Slovenia
imageUrl: https://cdn.nadeko.bot/flags/si-flag.gif
- word: Solomon Islands
imageUrl: https://cdn.nadeko.bot/flags/bp-flag.gif
- word: Somalia
imageUrl: https://cdn.nadeko.bot/flags/so-flag.gif
- word: South Africa
imageUrl: https://cdn.nadeko.bot/flags/sf-flag.gif
- word: South Korea
imageUrl: https://cdn.nadeko.bot/flags/ks-flag.gif
- word: South Sudan
imageUrl: https://cdn.nadeko.bot/flags/od-flag.gif
- word: Spain
imageUrl: https://cdn.nadeko.bot/flags/sp-flag.gif
- word: Sri Lanka
imageUrl: https://cdn.nadeko.bot/flags/ce-flag.gif
- word: St. Vincent Grenadines
imageUrl: https://cdn.nadeko.bot/flags/vc-flag.gif
- word: State of Palestine
imageUrl: https://cdn.nadeko.bot/flags/palestine-flag.gif
- word: Sudan
imageUrl: https://cdn.nadeko.bot/flags/su-flag.gif
- word: Suriname
imageUrl: https://cdn.nadeko.bot/flags/ns-flag.gif
- word: Sweden
imageUrl: https://cdn.nadeko.bot/flags/sw-flag.gif
- word: Switzerland
imageUrl: https://cdn.nadeko.bot/flags/sz-flag.gif
- word: Syria
imageUrl: https://cdn.nadeko.bot/flags/sy-flag.gif
- word: Tajikistan
imageUrl: https://cdn.nadeko.bot/flags/ti-flag.gif
- word: Tanzania
imageUrl: https://cdn.nadeko.bot/flags/tz-flag.gif
- word: Thailand
imageUrl: https://cdn.nadeko.bot/flags/th-flag.gif
- word: Timor-Leste
imageUrl: https://cdn.nadeko.bot/flags/tt-flag.gif
- word: Togo
imageUrl: https://cdn.nadeko.bot/flags/to-flag.gif
- word: Tonga
imageUrl: https://cdn.nadeko.bot/flags/tn-flag.gif
- word: Trinidad and Tobago
imageUrl: https://cdn.nadeko.bot/flags/td-flag.gif
- word: Tunisia
imageUrl: https://cdn.nadeko.bot/flags/ts-flag.gif
- word: Turkey
imageUrl: https://cdn.nadeko.bot/flags/tu-flag.gif
- word: Turkmenistan
imageUrl: https://cdn.nadeko.bot/flags/tx-flag.gif
- word: Tuvalu
imageUrl: https://cdn.nadeko.bot/flags/tv-flag.gif
- word: United Arab Emirates
imageUrl: https://cdn.nadeko.bot/flags/ae-flag.gif
- word: United Kingdom
imageUrl: https://cdn.nadeko.bot/flags/uk-flag.gif
- word: United States Of America
imageUrl: https://cdn.nadeko.bot/flags/us-flag.gif
- word: Uganda
imageUrl: https://cdn.nadeko.bot/flags/ug-flag.gif
- word: Ukraine
imageUrl: https://cdn.nadeko.bot/flags/up-flag.gif
- word: Uruguay
imageUrl: https://cdn.nadeko.bot/flags/uy-flag.gif
- word: Uzbekistan
imageUrl: https://cdn.nadeko.bot/flags/uz-flag.gif
- word: Vanuatu
imageUrl: https://cdn.nadeko.bot/flags/nh-flag.gif
- word: Venezuela
imageUrl: https://cdn.nadeko.bot/flags/ve-flag.gif
- word: Vietnam
imageUrl: https://cdn.nadeko.bot/flags/vm-flag.gif
- word: Yemen
imageUrl: https://cdn.nadeko.bot/flags/ym-flag.gif
- word: Zambia
imageUrl: https://cdn.nadeko.bot/flags/za-flag.gif
- word: Zimbabwe
imageUrl: https://cdn.nadeko.bot/flags/zi-flag.gif

View File

@@ -0,0 +1,400 @@
- word: 'Underworld: Blood Wars'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/PIXSMakrO3s2dqA7mCvAAoVR0E.jpg
- word: Fantastic Beasts and Where to Find Them
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6I2tPx6KIiBB4TWFiWwNUzrbxUn.jpg
- word: Suicide Squad
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/34dxtTxMHGKw1njHpTjDqR8UBHd.jpg
- word: Miss Peregrine's Home for Peculiar Children
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qXQinDhDZkTiqEGLnav0h1YSUu8.jpg
- word: Sully
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/vC9H1ZVdXi1KjH4aPfGB54mvDNh.jpg
- word: Arrival
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/yIZ1xendyqKvY3FGeeUYUd5X9Mm.jpg
- word: Doctor Strange
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/tFI8VLMgSTTU38i8TIsklfqS9Nl.jpg
- word: 'Mad Max: Fury Road'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/tbhdm8UJAb4ViCTsulYFL3lxMCd.jpg
- word: Interstellar
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/xu9zaAevzQ5nnrsXN6JcahLnG4i.jpg
- word: Jason Bourne
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/AoT2YrJUJlg5vKE3iMOLvHlTd3m.jpg
- word: 'Captain America: Civil War'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/m5O3SZvQ6EgD5XXXLPIP1wLppeW.jpg
- word: Moana
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/1qGzqGUd1pa05aqYXGSbLkiBlLB.jpg
- word: 'The Hunger Games: Mockingjay - Part 1'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/83nHcz2KcnEpPXY50Ky2VldewJJ.jpg
- word: Underworld
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/cPhRPAJWK8BuuJqqf6PztzvOlnZ.jpg
- word: The Secret Life of Pets
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lubzBMQLLmG88CLQ4F3TxZr2Q7N.jpg
- word: Insurgent
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/L5QRL1O3fGs2hH1LbtYyVl8Tce.jpg
- word: Jurassic World
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/dkMD5qlogeRMiEixC4YNPUvax2T.jpg
- word: Ben-Hur
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/A4xbEpe9LevQCdvaNC0z6r8AfYk.jpg
- word: Finding Dory
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/iWRKYHTFlsrxQtfQqFOQyceL83P.jpg
- word: Guardians of the Galaxy
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bHarw8xrmQeqf3t8HpuMY7zoK4x.jpg
- word: Ghostbusters
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/58bvfg9b040GDmKffLUJsEjg779.jpg
- word: Inferno
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/anmLLbDx9d98NMZRyVUtxwJR6ab.jpg
- word: Star Trek Beyond
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6uBlEXZCUHM15UNZqNig17VdN4m.jpg
- word: The BFG
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/eYT9XQBo1eC4DwPYqhCol0dFFc2.jpg
- word: Pete's Dragon
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/AaRhHX0Jfpju0O6hNzScPRgX9Mm.jpg
- word: 'Mechanic: Resurrection'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6kMu4vECAyTpj2Z7n8viJ4RAaYh.jpg
- word: The Imitation Game
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qcb6z1HpokTOKdjqDTsnjJk0Xvg.jpg
- word: 'X-Men: Apocalypse'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/oQWWth5AOtbWG9o8SCAviGcADed.jpg
- word: John Wick
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/mFb0ygcue4ITixDkdr7wm1Tdarx.jpg
- word: Deadpool
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/n1y094tVDFATSzkTnFxoGZ1qNsG.jpg
- word: 'Batman v Superman: Dawn of Justice'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/vsjBeMPZtyB7yNsYY56XYxifaQZ.jpg
- word: The Revenant
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/kiWvoV78Cc3fUwkOHKzyBgVdrDD.jpg
- word: Now You See Me 2
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/zrAO2OOa6s6dQMQ7zsUbDyIBrAP.jpg
- word: 'Star Wars: The Force Awakens'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/c2Ax8Rox5g6CneChwy1gmu4UbSb.jpg
- word: The Martian
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/sy3e2e4JwdAtd2oZGA2uUilZe8j.jpg
- word: Bridget Jones's Baby
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/w9VNDcQet0TUoLRWHg8JbT4QjpW.jpg
- word: Minions
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/uX7LXnsC7bZJZjn048UCOwkPXWJ.jpg
- word: Star Wars
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/4iJfYYoQzZcONB9hNzg0J0wWyPH.jpg
- word: Spectre
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/wVTYlkKPKrljJfugXN7UlLNjtuJ.jpg
- word: 'Rogue One: A Star Wars Story'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/tZjVVIYXACV4IIIhXeIM59ytqwS.jpg
- word: Big Hero 6
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/2BXd0t9JdVqCp9sKf6kzMkr7QjB.jpg
- word: 'Independence Day: Resurgence'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8SqBiesvo1rh9P1hbJTmnVum6jv.jpg
- word: The Dark Knight
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nnMC0BM6XbjIIrT4miYmMtPGcQV.jpg
- word: Sausage Party
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nBvyktlVHjLx5nZ9Oxaoqo5jwbf.jpg
- word: Gone Girl
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bt6DhdALyhf90gReozoQ0y3R3vZ.jpg
- word: Zootopia
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/mhdeE1yShHTaDbJVdWyTlzFvNkr.jpg
- word: Allegiant
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/sFthBeT0Y3WVfg6b3MkcJs9qfzq.jpg
- word: 'The Hobbit: The Battle of the Five Armies'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qhH3GyIfAnGv1pjdV3mw03qAilg.jpg
- word: Fury
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/pKawqrtCBMmxarft7o1LbEynys7.jpg
- word: The Jungle Book
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/eIOTsGg9FCVrBc4r2nXaV61JF4F.jpg
- word: 'Jack Reacher: Never Go Back'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/4ynQYtSEuU5hyipcGkfD6ncwtwz.jpg
- word: 'Pirates of the Caribbean: The Curse of the Black Pearl'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8AUQ7YlJJA9C8kWk8P4YNHIcFDE.jpg
- word: 'The Hunger Games: Mockingjay - Part 2'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qjn3fzCAHGfl0CzeUlFbjrsmu4c.jpg
- word: Hell or High Water
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5GbRKOQSY08U3SQXXcQAKEnL2rE.jpg
- word: Terminator Genisys
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bIlYH4l2AyYvEysmS2AOfjO7Dn8.jpg
- word: Ant-Man
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/kvXLZqY0Ngl1XSw7EaMQO0C1CCj.jpg
- word: The Shallows
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lEkHdk4g0nAKtMcHBtSmC1ON3O1.jpg
- word: 'Underworld: Awakening'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8iNsXY3LPsuT0gnUiTBMoNuRZI7.jpg
- word: Inception
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/s2bT29y0ngXxxu2IA8AOzzXTRhd.jpg
- word: 'Underworld: Evolution'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lLZTsh8qDZsHCG9GMnqZKIlluZT.jpg
- word: The Hateful Eight
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/sSvgNBeBNzAuKl8U8sP50ETJPgx.jpg
- word: Fight Club
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/wSJPjqp2AZWQ6REaqkMuXsCIs64.jpg
- word: 'Avengers: Age of Ultron'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/570qhjGZmGPrBGnfx70jcwIuBr4.jpg
- word: 'Underworld: Rise of the Lycans'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/gVfnoiCJBdv2SN7poIbU7eyNVq1.jpg
- word: Tomorrowland
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/fQbc5XuB4vWA9gnY1CmyxFaOufF.jpg
- word: The Matrix
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/7u3pxc0K1wx32IleAkLv78MKgrw.jpg
- word: Furious 7
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ypyeMfKydpyuuTMdp36rMlkGDUL.jpg
- word: Pixels
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nvZVu6inpwLHKqRXZhye3S4uqei.jpg
- word: Emerald Green
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ioKU3dEgx0HeUWp3KI2X7YF8FdC.jpg
- word: Whiplash
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6bbZ6XyvgfjhQwbplnUh1LSj1ky.jpg
- word: The Legend of Tarzan
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/pWNBPN8ghaKtGLcQBMwNyM32Wbm.jpg
- word: Lucy
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/eCgIoGvfNXrbSiQGqQHccuHjQHm.jpg
- word: Allied
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6o4KCKjP1WcefXLBNRyhEenB2nW.jpg
- word: Eliminators
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lNhwy85HjhieIVfmWoDAL2wCchB.jpg
- word: 'Ice Age: Collision Course'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/o29BFNqgXOUT1yHNYusnITsH7P9.jpg
- word: Batman Begins
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/65JWXDCAfwHhJKnDwRnEgVB411X.jpg
- word: Teenage Mutant Ninja Turtles
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/OqCXGt5nl1cHPeotxCDvXLLe6p.jpg
- word: Birdman
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/hUDEHvhNJLNcb83Pp7xnFn0Wj09.jpg
- word: Avatar
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5XPPB44RQGfkBrbJxmtdndKz05n.jpg
- word: 'Kingsman: The Secret Service'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/pfyWJUxrBTT2UIPoEQF3iFTHcQT.jpg
- word: "Pirates of the Caribbean: At World's End"
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8ZgpAftUiYTU76IhUADITa3Ur9n.jpg
- word: Bad Moms
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/elPpPBuYB2Zn5wFwz2FSlJlKUjp.jpg
- word: Inside Out
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/szytSpLAyBh3ULei3x663mAv5ZT.jpg
- word: Harry Potter and the Philosopher's Stone
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/uD93T339xX1k3fnDUaeopZBiajY.jpg
- word: Dawn of the Planet of the Apes
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/rjUl3pd1LHVOVfG4IGcyA1cId5l.jpg
- word: Iron Man
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ZQixhAZx6fH1VNafFXsqa1B8QI.jpg
- word: The Dark Knight Rises
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/3bgtUfKQKNi3nJsAB5URpP2wdRt.jpg
- word: Don't Breathe
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bCThHXQ3aLLDU3KFST0rC8mTan5.jpg
- word: The Avengers
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/hbn46fQaRmlpBuUrEiFqv0GDL6Y.jpg
- word: Alice Through the Looking Glass
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/rWlXrfmX1FgcPyj7oQmLfwKRaam.jpg
- word: Now You See Me
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/9wbXqcx6rHhoZ9Esp03C7amQzom.jpg
- word: The Accountant
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/i9flZtw3BwukADQpu5PlrkwPYSY.jpg
- word: The Maze Runner
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/yTbPPmLAn7DiiM0sPYfZduoAjB.jpg
- word: Forrest Gump
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ctOEhQiFIHWkiaYp7b0ibSTe5IL.jpg
- word: 'The Hunger Games: Catching Fire'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/wRCPG1lsgfTFkWJ7G3eWgxCgv0C.jpg
- word: Warcraft
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5SX2rgKXZ7NVmAJR5z5LprqSXKa.jpg
- word: 'Eddie Izzard: Glorious'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/2XHkh7xLqH168KRqMwDuiTmuyQi.jpg
- word: Office Christmas Party
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bzguuhqUI9G8jJ3EBtJ9p12g1Lr.jpg
- word: 'Transformers: The Last Knight'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lQmtMCQgBwcODAyNnKGQrW0Kza8.jpg
- word: Skyfall
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/AunH2MIKIbnU9khgFp45eJlydPu.jpg
- word: 'The Hobbit: An Unexpected Journey'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/jjAq3tCezdlQduusgtMhpY2XzW0.jpg
- word: 'The Lord of the Rings: The Fellowship of the Ring'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/pIUvQ9Ed35wlWhY2oU6OmwEsmzG.jpg
- word: Kubo and the Two Strings
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/n4FeRnlH0ERa1kCUh0NXOyQvxnd.jpg
- word: 10 Cloverfield Lane
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qEu2EJBQUNFx5mSKOCItwZm74ZE.jpg
- word: 'Captain America: The First Avenger'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/pmZtj1FKvQqISS6iQbkiLg5TAsr.jpg
- word: The Shawshank Redemption
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/xBKGJQsAIeweesB79KC89FpBrVr.jpg
- word: Me Before You
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/o4lxNwKJz8oq3R0kLOIsDlHbDhZ.jpg
- word: The Magnificent Seven
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/T3LrH6bnV74llVbFpQsCBrGaU9.jpg
- word: The Lion King
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/klI0K4oQMsLhHdjA9Uw8WLugk9v.jpg
- word: Quantum of Solace
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/hfZVY8lMiE7HH1cDc2qzSFF6Kbt.jpg
- word: Sing
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/srpt7oa3AmmJXd2K5x9ZVzmV0I3.jpg
- word: Nightcrawler
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ts4j3zYaPzdUVF3ijBeBdGVDWjX.jpg
- word: Snowden
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qzGFm7uF1HExPUAcAPwC3Hzk5WR.jpg
- word: The Equalizer
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/b1uY9m6sZLLfa8jxtBvZg9esSvd.jpg
- word: Divergent
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/g6WT9zxATzTy9NVu2xwbxDAxvjd.jpg
- word: "Pirates of the Caribbean: Dead Man's Chest"
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/hdHgIcljPHli4xaJGt0INz8Gn3J.jpg
- word: War Dogs
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/2cLndRZy8e3das3vVaK3BdJfRIi.jpg
- word: Pulp Fiction
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/mte63qJaVnoxkkXbHkdFujBnBgd.jpg
- word: 'Transformers: Age of Extinction'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/cHy7nSitAVgvZ7qfCK4JO47t3oZ.jpg
- word: Gladiator
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5vZw7ltCKI0JiOYTtRxaIC3DX0e.jpg
- word: Nerve
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/a0wohltYr7Tzkgg2X6QKBe3txj1.jpg
- word: I Am Legend
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/u6Qg7TH7Oh1IFWCQSRr4htFFt0A.jpg
- word: 'Teenage Mutant Ninja Turtles: Out of the Shadows'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/999RuhZvog8ocyvcccVV9yGmMjL.jpg
- word: Cinderella
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/aUYcExsGuRaw7PLGmAmXubt1dfG.jpg
- word: The Big Short
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/jmlMLYEsYY1kRc5qHIyTdxCeVmZ.jpg
- word: 'X-Men: Days of Future Past'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5LBcSLHAtEIIgvNkA2dPmYH5wR7.jpg
- word: Shutter Island
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/fmLWuAfDPaUa3Vi5nO1YUUyZaX6.jpg
- word: 'Captain America: The Winter Soldier'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/4qfXT9BtxeFuamR4F49m2mpKQI1.jpg
- word: San Andreas
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/cUfGqafAVQkatQ7N4y08RNV3bgu.jpg
- word: The Mummy
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/3qthpSSyBY6Efeu1sqkO8L1Eyyb.jpg
- word: Chappie
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/y5lG7TBpeOMG0jxAaTK0ghZSzBJ.jpg
- word: Bridge of Spies
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/3amJMLyjx0rDbwhnKNG8d6gzDSV.jpg
- word: 'The Lord of the Rings: The Return of the King'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8BPZO0Bf8TeAy8znF43z8soK3ys.jpg
- word: 'Kill Bill: Vol. 1'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/kkS8PKa8c134vXsj2fQkNqOaCXU.jpg
- word: 'Pirates of the Caribbean: On Stranger Tides'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/l7zANdjgTvYqwZUx76Vk0EKpCH5.jpg
- word: The Nice Guys
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/a7eSkK4bkLwKCXYDdYIqLxrqT2n.jpg
- word: Harry Potter and the Chamber of Secrets
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/avqzwKn89VetTEvAlBePt3Us6Al.jpg
- word: 'The Lord of the Rings: The Two Towers'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/dG4BmM32XJmKiwopLDQmvXEhuHB.jpg
- word: Titanic
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/2Te2YJoLtT2cHME7i5kDuEwJWZc.jpg
- word: "The Huntsman: Winter's War"
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nQ0UvXdxoMZguLuPj0sdV0U36KR.jpg
- word: Thor
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6UxFfo8K3vcihtUpX1ek2ucGeEZ.jpg
- word: Taken 3
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/razvUuLkF7CX4XsLyj02ksC0ayy.jpg
- word: Lights Out
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nQsdGCVTEq78XwIgR6QUVxiNERI.jpg
- word: 'Night at the Museum: Secret of the Tomb'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6tKleiKS54focE4z0sdtLOIEgK8.jpg
- word: Up
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/qMjbMPkSCc1K19zuXNM2BgIsIRz.jpg
- word: The Bourne Identity
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/2Fr1vqBiDn8xRJM9elcplzHctTN.jpg
- word: Frozen
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/cAhCDpAq80QCeQvHytY9JkBalpH.jpg
- word: 'Thor: The Dark World'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/3FweBee0xZoY77uO1bhUOlQorNH.jpg
- word: The Wolf of Wall Street
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/rP36Rx5RQh0rmH2ynEIaG8DxbV2.jpg
- word: Resident Evil
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/s41Er80jGJf3tNkgYHxUCttjmwv.jpg
- word: Iron Man 3
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/n9X2DKItL3V0yq1q1jrk8z5UAki.jpg
- word: Ice Age
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/oDqbewoFuIEWA7UWurole6MzDGn.jpg
- word: Central Intelligence
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/zaGmoSackrRF7w6NieQ0FWY0M7k.jpg
- word: 'The Mummy: Tomb of the Dragon Emperor'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/caB8JFUigSHdGsdxOxaK4vZtOiN.jpg
- word: The Man from U.N.C.L.E.
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bKxcCNv2xq8M3GD5iSrv9bMGDVa.jpg
- word: Gravity
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/9aoWzwOwy9NLuSk9LkBwwrBdPYM.jpg
- word: Ex Machina
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/9X3cDZb4GYGQeOnZHLwMcCFz2Ro.jpg
- word: Harry Potter and the Goblet of Fire
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/gzKW3emulMxIHzuXxZoyDB1lei9.jpg
- word: Man of Steel
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/jYLh4mdOqkt30i7LTFs3o02UcGF.jpg
- word: 'Harry Potter and the Deathly Hallows: Part 1'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8YA36faYlkpfp6aozcGsqq68pZ9.jpg
- word: Iron Man 2
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/jxdSxqAFrdioKgXwgTs5Qfbazjq.jpg
- word: The Angry Birds Movie
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/3mJcfL2lPfRky16EPi95d2YrKqu.jpg
- word: Room
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/tBhp8MGaiL3BXpPCSl5xY397sGH.jpg
- word: Ted 2
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nkwoiSVJLeK0NI8kTqioBna61bm.jpg
- word: 'Exodus: Gods and Kings'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/hOOgtrByGgWfqGTTn5VL7jkLYXJ.jpg
- word: 'Terminator 2: Judgment Day'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/d9AqtruwS8nljKjL5aYzM42hQJr.jpg
- word: Harry Potter and the Prisoner of Azkaban
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/wWdlIBxn9xCmySxnSWtI2BjZZkF.jpg
- word: Genius
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/5eovlgVfijObBm4TtW1QSaj32q3.jpg
- word: Inglourious Basterds
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bk0GylJLneaSbpQZXpgTwleYigq.jpg
- word: Hacksaw Ridge
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/zBK4QZONMQXhcgaJv1YYTdCW7q9.jpg
- word: Trolls
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/wc1JxADaBLuWhySkaawCBTpixCo.jpg
- word: The Shining
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/h4DcDCOkQBENWBJZjNlPv3adQfM.jpg
- word: A Walk Among the Tombstones
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/e56QsaJy1weAUukiK2ZmIGVUALF.jpg
- word: Dr. No
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/bplDiT5JhaXf9S5arO8g5QsFtDi.jpg
- word: 'Mission: Impossible'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/7CiZuIPCLvhhMICT2PONuwr2BMG.jpg
- word: 'The Purge: Anarchy'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/1sOkQtqmBji7iquGfQlHOrFqplN.jpg
- word: 'Maze Runner: The Scorch Trials'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/iapRFMGKvN9tsjqPlN7MIDTCezG.jpg
- word: Jupiter Ascending
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/4liSXBZZdURI0c1Id1zLJo6Z3Gu.jpg
- word: Morgan
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/g3XhTkjUxLbzVVa63vuopSNNZE8.jpg
- word: Se7en
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/ba4CpvnaxvAgff2jHiaqJrVpZJ5.jpg
- word: Charlie and the Chocolate Factory
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/mrRAx1OsNVEKJv0ktQprspieqnS.jpg
- word: Self/less
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/fpKyGCOZJsYe2TAKLtziLe6EPj9.jpg
- word: The Prestige
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/c5o7FN2vzI7xlU6IF1y64mgcH9E.jpg
- word: The Departed
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/8Od5zV7Q7zNOX0y9tyNgpTmoiGA.jpg
- word: Monsters, Inc.
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/eKBUYeSgGVvztO2MZxD5YMcz6kv.jpg
- word: Raiders of the Lost Ark
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/dU1CArBM4YsKLfG8YvhtuTJJaGR.jpg
- word: The Terminator
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6yFoLNQgFdVbA8TZMdfgVpszOla.jpg
- word: The Mummy Returns
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/22SUPrwoHNbMjZci1kRvBmCqrek.jpg
- word: Pan
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6Ym6bgfhvpgQS5Sg8kKnfW1hX7P.jpg
- word: Fifty Shades of Grey
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/zw3fM9KYYhYGsIQUJOyQNbeZSnn.jpg
- word: Casino Royale
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/xq6hXdBpDPIXWjtmvbFmtLvBFJt.jpg
- word: Free State of Jones
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/zgo0s1fmBCWUweNrCVIK1dZEOJ6.jpg
- word: Despicable Me
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/yo1ef57MEPkEE4BDZKTZGH9uDcX.jpg
- word: Creed
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/nF4kmc4gDRQU4OJiJgk6sZtbJbl.jpg
- word: Seventh Son
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/lNnrr7OR7dkqfgIyju8nUJHcf8x.jpg
- word: The Hunger Games
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/1LTLrl06uII4w2BTpnQnmWwrKi.jpg
- word: Saving Private Ryan
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/gRtLcCQOpYUI9ThdVzi4VUP8QO3.jpg
- word: 'Harry Potter and the Deathly Hallows: Part 2'
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6n0DAcyjTHS6888mt8U9ZsLy9nR.jpg
- word: 12 Years a Slave
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/xnRPoFI7wzOYviw3PmoG94X2Lnc.jpg
- word: Dracula Untold
imageUrl: https://image.tmdb.org/t/p/w300_and_h450_bestv2/6UPlIYKxZqUR6Xbpgu1JKG0J7UC.jpg

View File

@@ -0,0 +1,380 @@
- word: apple
imageUrl: https://www.randomlists.com/img/things/apple.jpg.jpg
- word: bag
imageUrl: https://www.randomlists.com/img/things/bag.jpg.jpg
- word: balloon
imageUrl: https://www.randomlists.com/img/things/balloon.jpg.jpg
- word: bananas
imageUrl: https://www.randomlists.com/img/things/bananas.jpg.jpg
- word: bed
imageUrl: https://www.randomlists.com/img/things/bed.jpg.jpg
- word: beef
imageUrl: https://www.randomlists.com/img/things/beef.jpg.jpg
- word: blouse
imageUrl: https://www.randomlists.com/img/things/blouse.jpg.jpg
- word: book
imageUrl: https://www.randomlists.com/img/things/book.jpg.jpg
- word: bookmark
imageUrl: https://www.randomlists.com/img/things/bookmark.jpg.jpg
- word: boom box
imageUrl: https://www.randomlists.com/img/things/boom_box.jpg.jpg
- word: bottle
imageUrl: https://www.randomlists.com/img/things/bottle.jpg.jpg
- word: bottle cap
imageUrl: https://www.randomlists.com/img/things/bottle_cap.jpg
- word: bow
imageUrl: https://www.randomlists.com/img/things/bow.jpg
- word: bowl
imageUrl: https://www.randomlists.com/img/things/bowl.jpg
- word: box
imageUrl: https://www.randomlists.com/img/things/box.jpg
- word: bracelet
imageUrl: https://www.randomlists.com/img/things/bracelet.jpg
- word: bread
imageUrl: https://www.randomlists.com/img/things/bread.jpg
- word: broccoli
imageUrl: https://www.randomlists.com/img/things/brocolli.jpg
- word: hair brush
imageUrl: https://www.randomlists.com/img/things/hair_brush.jpg
- word: buckle
imageUrl: https://www.randomlists.com/img/things/buckel.jpg
- word: button
imageUrl: https://www.randomlists.com/img/things/button.jpg
- word: camera
imageUrl: https://www.randomlists.com/img/things/camera.jpg
- word: candle
imageUrl: https://www.randomlists.com/img/things/candle.jpg
- word: candy wrapper
imageUrl: https://www.randomlists.com/img/things/candy_wrapper.jpg
- word: canvas
imageUrl: https://www.randomlists.com/img/things/canvas.jpg
- word: car
imageUrl: https://www.randomlists.com/img/things/car.jpg
- word: greeting card
imageUrl: https://www.randomlists.com/img/things/greeting_card.jpg
- word: playing card
imageUrl: https://www.randomlists.com/img/things/playing_card.jpg
- word: carrots
imageUrl: https://www.randomlists.com/img/things/carrots.jpg
- word: cat
imageUrl: https://www.randomlists.com/img/things/cat.jpg
- word: CD
imageUrl: https://www.randomlists.com/img/things/CD.jpg
- word: cell phone
imageUrl: https://www.randomlists.com/img/things/cell_phone.jpg
- word: packing peanuts
imageUrl: https://www.randomlists.com/img/things/packing_peanuts.jpg
- word: cinder block
imageUrl: https://www.randomlists.com/img/things/cinder_block.jpg
- word: chair
imageUrl: https://www.randomlists.com/img/things/chair.jpg
- word: chalk
imageUrl: https://www.randomlists.com/img/things/chalk.jpg
- word: newspaper
imageUrl: https://www.randomlists.com/img/things/newspaper.jpg
- word: soy sauce packet
imageUrl: https://www.randomlists.com/img/things/soy_sauce_packet.jpg
- word: chapter book
imageUrl: https://www.randomlists.com/img/things/chapter_book.jpg
- word: checkbook
imageUrl: https://www.randomlists.com/img/things/checkbook.jpg
- word: chocolate
imageUrl: https://www.randomlists.com/img/things/chocolate.jpg
- word: clay pot
imageUrl: https://www.randomlists.com/img/things/clay_pot.jpg
- word: clock
imageUrl: https://www.randomlists.com/img/things/clock.jpg
- word: clothes
imageUrl: https://www.randomlists.com/img/things/clothes.jpg
- word: computer
imageUrl: https://www.randomlists.com/img/things/computer.jpg
- word: conditioner
imageUrl: https://www.randomlists.com/img/things/conditioner.jpg
- word: cookie jar
imageUrl: https://www.randomlists.com/img/things/cookie_jar.jpg
- word: cork
imageUrl: https://www.randomlists.com/img/things/cork.jpg
- word: couch
imageUrl: https://www.randomlists.com/img/things/couch.jpg
- word: credit card
imageUrl: https://www.randomlists.com/img/things/credit_card.jpg
- word: cup
imageUrl: https://www.randomlists.com/img/things/cup.jpg
- word: deodorant
imageUrl: https://www.randomlists.com/img/things/deodorant_.jpg
- word: desk
imageUrl: https://www.randomlists.com/img/things/desk.jpg
- word: door
imageUrl: https://www.randomlists.com/img/things/door.jpg
- word: drawer
imageUrl: https://www.randomlists.com/img/things/drawer.jpg
- word: drill press
imageUrl: https://www.randomlists.com/img/things/drill_press.jpg
- word: eraser
imageUrl: https://www.randomlists.com/img/things/earser.jpg
- word: eye liner
imageUrl: https://www.randomlists.com/img/things/eye_liner.jpg
- word: face wash
imageUrl: https://www.randomlists.com/img/things/face_wash.jpg
- word: fake flowers
imageUrl: https://www.randomlists.com/img/things/fake_flowers.jpg
- word: flag
imageUrl: https://www.randomlists.com/img/things/flag.jpg
- word: floor
imageUrl: https://www.randomlists.com/img/things/floor.jpg
- word: flowers
imageUrl: https://www.randomlists.com/img/things/flowers.jpg
- word: food
imageUrl: https://www.randomlists.com/img/things/food.jpg
- word: fork
imageUrl: https://www.randomlists.com/img/things/fork.jpg
- word: fridge
imageUrl: https://www.randomlists.com/img/things/fridge.jpg
- word: glass
imageUrl: https://www.randomlists.com/img/things/glass.jpg
- word: glasses
imageUrl: https://www.randomlists.com/img/things/glasses.jpg
- word: glow stick
imageUrl: https://www.randomlists.com/img/things/glow_stick.jpg
- word: grid paper
imageUrl: https://www.randomlists.com/img/things/grid_paper.jpg
- word: hair tie
imageUrl: https://www.randomlists.com/img/things/hair_tie.jpg
- word: hanger
imageUrl: https://www.randomlists.com/img/things/hanger.jpg
- word: helmet
imageUrl: https://www.randomlists.com/img/things/helmet.jpg
- word: house
imageUrl: https://www.randomlists.com/img/things/house.jpg
- word: ipod
imageUrl: https://www.randomlists.com/img/things/ipod.jpg
- word: charger
imageUrl: https://www.randomlists.com/img/things/charger.jpg
- word: key chain
imageUrl: https://www.randomlists.com/img/things/key_chain.jpg
- word: keyboard
imageUrl: https://www.randomlists.com/img/things/keyboard.jpg
- word: keys
imageUrl: https://www.randomlists.com/img/things/keys.jpg
- word: knife
imageUrl: https://www.randomlists.com/img/things/knife.jpg
- word: lace
imageUrl: https://www.randomlists.com/img/things/lace.jpg
- word: lamp
imageUrl: https://www.randomlists.com/img/things/lamp.jpg
- word: lamp shade
imageUrl: https://www.randomlists.com/img/things/lamp_shade.jpg
- word: leg warmers
imageUrl: https://www.randomlists.com/img/things/leg_warmers.jpg
- word: lip gloss
imageUrl: https://www.randomlists.com/img/things/lip_gloss.jpg
- word: lotion
imageUrl: https://www.randomlists.com/img/things/lotion.jpg
- word: milk
imageUrl: https://www.randomlists.com/img/things/milk.jpg
- word: mirror
imageUrl: https://www.randomlists.com/img/things/mirror.jpg
- word: model car
imageUrl: https://www.randomlists.com/img/things/model_car.jpg
- word: money
imageUrl: https://www.randomlists.com/img/things/money.jpg
- word: monitor
imageUrl: https://www.randomlists.com/img/things/monitor.jpg
- word: mop
imageUrl: https://www.randomlists.com/img/things/mop.jpg
- word: mouse pad
imageUrl: https://www.randomlists.com/img/things/mouse_pad.jpg
- word: mp3 player
imageUrl: https://www.randomlists.com/img/things/mp3_player.jpg
- word: nail clippers
imageUrl: https://www.randomlists.com/img/things/nail_clippers.jpg
- word: nail file
imageUrl: https://www.randomlists.com/img/things/nail_file.jpg
- word: needle
imageUrl: https://www.randomlists.com/img/things/needle.jpg
- word: outlet
imageUrl: https://www.randomlists.com/img/things/outlet.jpg
- word: paint brush
imageUrl: https://www.randomlists.com/img/things/paint_brush.jpg
- word: pants
imageUrl: https://www.randomlists.com/img/things/pants.jpg
- word: paper
imageUrl: https://www.randomlists.com/img/things/paper.jpg
- word: pen
imageUrl: https://www.randomlists.com/img/things/pen.jpg
- word: pencil
imageUrl: https://www.randomlists.com/img/things/pencil.jpg
- word: perfume
imageUrl: https://www.randomlists.com/img/things/perfume.jpg
- word: phone
imageUrl: https://www.randomlists.com/img/things/phone.jpg
- word: photo album
imageUrl: https://www.randomlists.com/img/things/photo_album.jpg
- word: picture frame
imageUrl: https://www.randomlists.com/img/things/picture_frame.jpg
- word: pillow
imageUrl: https://www.randomlists.com/img/things/pillow.jpg
- word: plastic fork
imageUrl: https://www.randomlists.com/img/things/plastic_fork.jpg
- word: plate
imageUrl: https://www.randomlists.com/img/things/plate.jpg
- word: pool stick
imageUrl: https://www.randomlists.com/img/things/pool_stick.jpg
- word: soda can
imageUrl: https://www.randomlists.com/img/things/soda_can.jpg
- word: puddle
imageUrl: https://www.randomlists.com/img/things/puddle.jpg
- word: purse
imageUrl: https://www.randomlists.com/img/things/purse.jpg
- word: blanket
imageUrl: https://www.randomlists.com/img/things/blanket.jpg
- word: radio
imageUrl: https://www.randomlists.com/img/things/radio.jpg
- word: remote
imageUrl: https://www.randomlists.com/img/things/remote.jpg
- word: ring
imageUrl: https://www.randomlists.com/img/things/ring.jpg
- word: rubber band
imageUrl: https://www.randomlists.com/img/things/rubber_band.jpg
- word: rubber duck
imageUrl: https://www.randomlists.com/img/things/rubber_duck.jpg
- word: rug
imageUrl: https://www.randomlists.com/img/things/rug.jpg
- word: rusty nail
imageUrl: https://www.randomlists.com/img/things/rusty_nail.jpg
- word: sailboat
imageUrl: https://www.randomlists.com/img/things/sailboat.jpg
- word: sand paper
imageUrl: https://www.randomlists.com/img/things/sand_paper.jpg
- word: sandal
imageUrl: https://www.randomlists.com/img/things/sandal.jpg
- word: scotch tape
imageUrl: https://www.randomlists.com/img/things/scotch_tape.jpg
- word: screw
imageUrl: https://www.randomlists.com/img/things/screw.jpg
- word: seat belt
imageUrl: https://www.randomlists.com/img/things/seat_belt.jpg
- word: shampoo
imageUrl: https://www.randomlists.com/img/things/shampoo.jpg
- word: sharpie
imageUrl: https://www.randomlists.com/img/things/sharpie.jpg
- word: shawl
imageUrl: https://www.randomlists.com/img/things/shawl.jpg
- word: shirt
imageUrl: https://www.randomlists.com/img/things/shirt.jpg
- word: shoe lace
imageUrl: https://www.randomlists.com/img/things/shoe_lace.jpg
- word: shoes
imageUrl: https://www.randomlists.com/img/things/shoes.jpg
- word: shovel
imageUrl: https://www.randomlists.com/img/things/shovel.jpg
- word: sidewalk
imageUrl: https://www.randomlists.com/img/things/sidewalk.jpg
- word: sketch pad
imageUrl: https://www.randomlists.com/img/things/sketch_pad.jpg
- word: slipper
imageUrl: https://www.randomlists.com/img/things/slipper.jpg
- word: soap
imageUrl: https://www.randomlists.com/img/things/soap.jpg
- word: socks
imageUrl: https://www.randomlists.com/img/things/socks.jpg
- word: sofa
imageUrl: https://www.randomlists.com/img/things/sofa.jpg
- word: speakers
imageUrl: https://www.randomlists.com/img/things/speakers.jpg
- word: sponge
imageUrl: https://www.randomlists.com/img/things/sponge.jpg
- word: spoon
imageUrl: https://www.randomlists.com/img/things/spoon.jpg
- word: spring
imageUrl: https://www.randomlists.com/img/things/spring.jpg
- word: sticky note
imageUrl: https://www.randomlists.com/img/things/sticky_note.jpg
- word: stockings
imageUrl: https://www.randomlists.com/img/things/stockings.jpg
- word: stop sign
imageUrl: https://www.randomlists.com/img/things/stop_sign.jpg
- word: street lights
imageUrl: https://www.randomlists.com/img/things/street_lights.jpg
- word: sun glasses
imageUrl: https://www.randomlists.com/img/things/sun_glasses.jpg
- word: table
imageUrl: https://www.randomlists.com/img/things/table.jpg
- word: teddies
imageUrl: https://www.randomlists.com/img/things/teddies.jpg
- word: television
imageUrl: https://www.randomlists.com/img/things/television.jpg
- word: thermometer
imageUrl: https://www.randomlists.com/img/things/thermometer.jpg
- word: thread
imageUrl: https://www.randomlists.com/img/things/thread.jpg
- word: tire swing
imageUrl: https://www.randomlists.com/img/things/tire_swing.jpg
- word: tissue box
imageUrl: https://www.randomlists.com/img/things/tissue_box.jpg
- word: toe ring
imageUrl: https://www.randomlists.com/img/things/toe_ring.jpg
- word: toilet
imageUrl: https://www.randomlists.com/img/things/toilet.jpg
- word: tomato
imageUrl: https://www.randomlists.com/img/things/tomato.jpg
- word: tooth picks
imageUrl: https://www.randomlists.com/img/things/tooth_picks.jpg
- word: toothbrush
imageUrl: https://www.randomlists.com/img/things/toothbrush.jpg
- word: toothpaste
imageUrl: https://www.randomlists.com/img/things/toothpaste.jpg
- word: towel
imageUrl: https://www.randomlists.com/img/things/towel.jpg
- word: tree
imageUrl: https://www.randomlists.com/img/things/tree.jpg
- word: truck
imageUrl: https://www.randomlists.com/img/things/truck.jpg
- word: tv
imageUrl: https://www.randomlists.com/img/things/tv.jpg
- word: tweezers
imageUrl: https://www.randomlists.com/img/things/twezzers.jpg
- word: twister
imageUrl: https://www.randomlists.com/img/things/twister.jpg
- word: vase
imageUrl: https://www.randomlists.com/img/things/vase.jpg
- word: video games
imageUrl: https://www.randomlists.com/img/things/video_games.jpg
- word: wallet
imageUrl: https://www.randomlists.com/img/things/wallet.jpg
- word: washing machine
imageUrl: https://www.randomlists.com/img/things/washing_machine.jpg
- word: watch
imageUrl: https://www.randomlists.com/img/things/watch.jpg
- word: water bottle
imageUrl: https://www.randomlists.com/img/things/water_bottle.jpg
- word: doll
imageUrl: https://www.randomlists.com/img/things/doll.jpg
- word: magnet
imageUrl: https://www.randomlists.com/img/things/magnet.jpg
- word: wagon
imageUrl: https://www.randomlists.com/img/things/wagon.jpg
- word: headphones
imageUrl: https://www.randomlists.com/img/things/headphones.jpg
- word: clamp
imageUrl: https://www.randomlists.com/img/things/clamp.jpg
- word: USB drive
imageUrl: https://www.randomlists.com/img/things/USB_drive.jpg
- word: air freshener
imageUrl: https://www.randomlists.com/img/things/air_freshener.jpg
- word: piano
imageUrl: https://www.randomlists.com/img/things/piano.jpg
- word: ice cube tray
imageUrl: https://www.randomlists.com/img/things/ice_cube_tray.jpg
- word: white out
imageUrl: https://www.randomlists.com/img/things/white_out.jpg
- word: window
imageUrl: https://www.randomlists.com/img/things/window.jpg
- word: controller
imageUrl: https://www.randomlists.com/img/things/controller.jpg
- word: coasters
imageUrl: https://www.randomlists.com/img/things/coasters.jpg
- word: thermostat
imageUrl: https://www.randomlists.com/img/things/thermostat.jpg
- word: zipper
imageUrl: https://www.randomlists.com/img/things/zipper.jpg

View File

@@ -100,9 +100,11 @@ logserver:
- "enable"
- "disable"
logignore:
desc: "Toggles whether the `{0}logserver` command ignores this channel. Useful if you have hidden admin channel and public log channel."
desc: "Toggles whether the `{0}logserver` command ignores the specified channel or user. Provide no arguments to see the list of currently ignored users and channels"
args:
- ""
- "@SomeUser"
- "#some-channel"
repeatlist:
desc: "Shows currently repeating messages and their indexes."
args:
@@ -1319,11 +1321,11 @@ magicthegathering:
args:
- "about face"
hangmanlist:
desc: "Shows a list of hangman term types."
desc: "Shows a list of hangman question categories."
args:
- ""
hangman:
desc: "Starts a game of hangman in the channel. Use `{0}hangmanlist` to see a list of available term types. Defaults to 'all'."
desc: "Starts a game of hangman in the channel. You can optionally select a category `{0}hangmanlist` to see a list of available categories."
args:
- ""
- "movies"

View File

@@ -94,8 +94,12 @@
"log_all": "Logging all events in this channel.",
"log_disabled": "Logging disabled.",
"log_events": "Log events you can subscribe to:",
"log_ignore": "Logging will ignore {0}",
"log_not_ignore": "Logging will not ignore {0}",
"log_ignored_channels": "Ignored Channels",
"log_ignored_users": "Ignored Users",
"log_ignore_user": "Logging will ignore user {0}",
"log_not_ignore_user": "Logging will no longer ignore user {0}",
"log_ignore_chan": "Logging will ignore channel {0}",
"log_not_ignore_chan": "Logging will no longer ignore channel {0}",
"log_stop": "Stopped logging {0} event.",
"message_sent": "Message sent.",
"msg_not_found": "Message not found.",
@@ -463,8 +467,8 @@
"api_key_missing": "Api key missing.",
"invalid_input": "Invalid input.",
"not_found": "Not found.",
"failed_finding_anime": "Failed finding that animu.",
"failed_finding_manga": "Failed finding that mango.",
"failed_finding_anime": "Failed finding that anime.",
"failed_finding_manga": "Failed finding that manga.",
"genres": "Genres",
"authors": "Authors",
"height_weight": "Height/Weight",