grom/command
This module defines commands. Commands are the things you create and make available to your users.
This module will not help you with receiving slash commands, only with defining them and registering with Discord.
Use the grom/interaction and grom/gateway modules to receive interactions.
Types
pub type AllowedChannelType {
AllowTextChannels
AllowDmChannels
AllowVoiceChannels
AllowCategoryChannels
AllowAnnouncementChannels
AllowAnnouncementThreads
AllowPublicThreads
AllowPrivateThreads
AllowStageChannels
AllowForumChannels
AllowMediaChannels
}
Constructors
-
AllowTextChannels -
AllowDmChannels -
AllowVoiceChannels -
AllowCategoryChannels -
AllowAnnouncementChannels -
AllowAnnouncementThreads -
AllowPublicThreads -
AllowPrivateThreads -
AllowStageChannels -
AllowForumChannels -
AllowMediaChannels
pub type Command {
Slash(SlashCommand)
User(UserCommand)
Message(MessageCommand)
}
Constructors
-
Slash(SlashCommand) -
User(UserCommand) -
Message(MessageCommand)
pub type Context {
AllowedInGuilds
AllowedInBotDms
AllowedInPrivateChannels
}
Constructors
-
AllowedInGuilds -
AllowedInBotDms -
AllowedInPrivateChannels
pub type CreateForGuild {
CreateSlashForGuild(CreateSlashCommandForGuild)
CreateUserForGuild(CreateUserCommandForGuild)
CreateMessageForGuild(CreateMessageCommandForGuild)
}
Constructors
-
CreateSlashForGuild(CreateSlashCommandForGuild) -
CreateUserForGuild(CreateUserCommandForGuild) -
CreateMessageForGuild(CreateMessageCommandForGuild)
pub type CreateGlobal {
CreateGlobalSlash(CreateGlobalSlashCommand)
CreateGlobalUser(CreateGlobalUserCommand)
CreateGlobalMessage(CreateGlobalMessageCommand)
}
Constructors
-
CreateGlobalSlash(CreateGlobalSlashCommand) -
CreateGlobalUser(CreateGlobalUserCommand) -
CreateGlobalMessage(CreateGlobalMessageCommand)
pub type CreateGlobalMessageCommand {
CreateGlobalMessageCommand(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
is_nsfw: Bool,
)
}
Constructors
-
CreateGlobalMessageCommand( name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), is_nsfw: Bool, )
pub type CreateGlobalSlashCommand {
CreateGlobalSlashCommand(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
default_member_permissions: option.Option(
List(permission.Permission),
),
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
is_nsfw: Bool,
)
}
Constructors
-
CreateGlobalSlashCommand( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), default_member_permissions: option.Option( List(permission.Permission), ), integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), is_nsfw: Bool, )
pub type CreateGlobalUserCommand {
CreateGlobalUserCommand(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
is_nsfw: Bool,
)
}
Constructors
-
CreateGlobalUserCommand( name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), is_nsfw: Bool, )
pub type CreateMessageCommandForGuild {
CreateMessageCommandForGuild(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
)
}
Constructors
-
CreateMessageCommandForGuild( name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, )
pub type CreateSlashCommandForGuild {
CreateSlashCommandForGuild(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
)
}
Constructors
-
CreateSlashCommandForGuild( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, )
pub type CreateUserCommandForGuild {
CreateUserCommandForGuild(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
)
}
Constructors
-
CreateUserCommandForGuild( name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, )
pub type GuildPermissions {
GuildPermissions(
command_id: String,
application_id: String,
guild_id: String,
permissions: List(Permission),
)
}
Constructors
-
GuildPermissions( command_id: String, application_id: String, guild_id: String, permissions: List(Permission), )
pub type IntegerChoice {
IntegerChoice(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
value: Int,
)
}
Constructors
-
IntegerChoice( name: String, name_localizations: option.Option(dict.Dict(String, String)), value: Int, )
pub type MessageCommand {
MessageCommand(
id: String,
application_id: String,
guild_id: option.Option(String),
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
)
}
Constructors
-
MessageCommand( id: String, application_id: String, guild_id: option.Option(String), name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), )Arguments
- default_member_permissions
-
None -> All members can use it.
- integration_types
-
None -> Your application’s installation contexts for the scope in which the command is ran.
pub type ModifyForGuild {
ModifySlashForGuild(ModifySlashCommandForGuild)
ModifyUserForGuild(ModifyUserCommandForGuild)
ModifyMessageForGuild(ModifyMessageCommandForGuild)
}
Constructors
-
ModifySlashForGuild(ModifySlashCommandForGuild) -
ModifyUserForGuild(ModifyUserCommandForGuild) -
ModifyMessageForGuild(ModifyMessageCommandForGuild)
pub type ModifyGlobal {
ModifyGlobal(
name: option.Option(String),
name_localizations: modification.Modification(
dict.Dict(String, String),
),
description: option.Option(String),
description_localizations: modification.Modification(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
default_member_permissions: modification.Modification(
List(permission.Permission),
),
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
is_nsfw: option.Option(Bool),
)
}
Constructors
-
ModifyGlobal( name: option.Option(String), name_localizations: modification.Modification( dict.Dict(String, String), ), description: option.Option(String), description_localizations: modification.Modification( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), default_member_permissions: modification.Modification( List(permission.Permission), ), integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), is_nsfw: option.Option(Bool), )Arguments
- parameters
-
Please don’t use on anything other than slash commands. I will find you and do unspeakable violence.
pub type ModifyMessageCommandForGuild {
ModifyMessageCommandForGuild(
name: option.Option(String),
name_localizations: modification.Modification(
dict.Dict(String, String),
),
default_member_permissions: modification.Modification(
List(permission.Permission),
),
is_nsfw: option.Option(Bool),
)
}
Constructors
-
ModifyMessageCommandForGuild( name: option.Option(String), name_localizations: modification.Modification( dict.Dict(String, String), ), default_member_permissions: modification.Modification( List(permission.Permission), ), is_nsfw: option.Option(Bool), )
pub type ModifySlashCommandForGuild {
ModifySlashCommandForGuild(
name: option.Option(String),
name_localizations: modification.Modification(
dict.Dict(String, String),
),
description: option.Option(String),
description_localizations: modification.Modification(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
default_member_permissions: modification.Modification(
List(permission.Permission),
),
is_nsfw: option.Option(Bool),
)
}
Constructors
-
ModifySlashCommandForGuild( name: option.Option(String), name_localizations: modification.Modification( dict.Dict(String, String), ), description: option.Option(String), description_localizations: modification.Modification( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), default_member_permissions: modification.Modification( List(permission.Permission), ), is_nsfw: option.Option(Bool), )
pub type ModifyUserCommandForGuild {
ModifyUserCommandForGuild(
name: option.Option(String),
name_localizations: modification.Modification(
dict.Dict(String, String),
),
default_member_permissions: modification.Modification(
List(permission.Permission),
),
is_nsfw: option.Option(Bool),
)
}
Constructors
-
ModifyUserCommandForGuild( name: option.Option(String), name_localizations: modification.Modification( dict.Dict(String, String), ), default_member_permissions: modification.Modification( List(permission.Permission), ), is_nsfw: option.Option(Bool), )
pub type NumberChoice {
NumberChoice(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
value: Float,
)
}
Constructors
-
NumberChoice( name: String, name_localizations: option.Option(dict.Dict(String, String)), value: Float, )
pub type Parameter {
SubCommandParameter(ParameterSubCommand)
SubCommandGroupParameter(ParameterSubCommandGroup)
TextParameter(ParameterText)
IntegerParameter(ParameterInteger)
BooleanParameter(ParameterBoolean)
UserParameter(ParameterUser)
ChannelParameter(ParameterChannel)
RoleParameter(ParameterRole)
MentionableParameter(ParameterMentionable)
NumberParameter(ParameterNumber)
AttachmentParameter(ParameterAttachment)
}
Constructors
-
SubCommandParameter(ParameterSubCommand) -
SubCommandGroupParameter(ParameterSubCommandGroup) -
TextParameter(ParameterText) -
IntegerParameter(ParameterInteger) -
BooleanParameter(ParameterBoolean) -
UserParameter(ParameterUser) -
ChannelParameter(ParameterChannel) -
RoleParameter(ParameterRole) -
MentionableParameter(ParameterMentionable) -
NumberParameter(ParameterNumber) -
AttachmentParameter(ParameterAttachment)
pub type ParameterAttachment {
ParameterAttachment(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
)
}
Constructors
-
ParameterAttachment( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, )
pub type ParameterBoolean {
ParameterBoolean(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
)
}
Constructors
-
ParameterBoolean( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, )
pub type ParameterChannel {
ParameterChannel(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
allowed_channel_types: option.Option(List(AllowedChannelType)),
)
}
Constructors
-
ParameterChannel( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, allowed_channel_types: option.Option(List(AllowedChannelType)), )Arguments
- allowed_channel_types
-
Defaults to every channel type.
pub type ParameterInteger {
ParameterInteger(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
choices: option.Option(List(IntegerChoice)),
min_value: option.Option(Int),
max_value: option.Option(Int),
is_autocomplete: Bool,
)
}
Constructors
-
ParameterInteger( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, choices: option.Option(List(IntegerChoice)), min_value: option.Option(Int), max_value: option.Option(Int), is_autocomplete: Bool, )
pub type ParameterMentionable {
ParameterMentionable(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
)
}
Constructors
-
ParameterMentionable( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, )
pub type ParameterNumber {
ParameterNumber(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
choices: option.Option(List(NumberChoice)),
min_value: option.Option(Float),
max_value: option.Option(Float),
is_autocomplete: Bool,
)
}
Constructors
-
ParameterNumber( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, choices: option.Option(List(NumberChoice)), min_value: option.Option(Float), max_value: option.Option(Float), is_autocomplete: Bool, )
pub type ParameterRole {
ParameterRole(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
)
}
Constructors
-
ParameterRole( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, )
pub type ParameterSubCommand {
ParameterSubCommand(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
)
}
Constructors
-
ParameterSubCommand( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), )
pub type ParameterSubCommandGroup {
ParameterSubCommandGroup(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
)
}
Constructors
-
ParameterSubCommandGroup( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), )
pub type ParameterText {
ParameterText(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
choices: option.Option(List(TextChoice)),
min_length: option.Option(Int),
max_length: option.Option(Int),
is_autocomplete: Bool,
)
}
Constructors
-
ParameterText( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, choices: option.Option(List(TextChoice)), min_length: option.Option(Int), max_length: option.Option(Int), is_autocomplete: Bool, )
pub type ParameterUser {
ParameterUser(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
is_required: Bool,
)
}
Constructors
-
ParameterUser( name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), is_required: Bool, )
In this case, permission means whether a user is allowed to use a command. A denied role permission means that all users with this role are not allowed to use the command.
pub type Permission {
RolePermission(role_id: String, is_permission_granted: Bool)
UserPermission(user_id: String, is_permission_granted: Bool)
ChannelPermission(
channel_id: String,
is_permission_granted: Bool,
)
}
Constructors
-
RolePermission(role_id: String, is_permission_granted: Bool) -
UserPermission(user_id: String, is_permission_granted: Bool)If
user_id == guild_id,@everyonegets the permission status (granted/denied). -
ChannelPermission( channel_id: String, is_permission_granted: Bool, )If
channel_id == { guild_id - 1 }, all channels get the permission status (granted/denied).
pub type SlashCommand {
SlashCommand(
id: String,
application_id: String,
guild_id: option.Option(String),
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
description: String,
description_localizations: option.Option(
dict.Dict(String, String),
),
parameters: option.Option(List(Parameter)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
)
}
Constructors
-
SlashCommand( id: String, application_id: String, guild_id: option.Option(String), name: String, name_localizations: option.Option(dict.Dict(String, String)), description: String, description_localizations: option.Option( dict.Dict(String, String), ), parameters: option.Option(List(Parameter)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), )Arguments
- default_member_permissions
-
None -> All members can use it.
- integration_types
-
None -> Your application’s installation contexts for the scope in which the command is ran.
pub type TextChoice {
TextChoice(
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
value: String,
)
}
Constructors
-
TextChoice( name: String, name_localizations: option.Option(dict.Dict(String, String)), value: String, )
pub type UserCommand {
UserCommand(
id: String,
application_id: String,
guild_id: option.Option(String),
name: String,
name_localizations: option.Option(dict.Dict(String, String)),
default_member_permissions: option.Option(
List(permission.Permission),
),
is_nsfw: Bool,
integration_types: option.Option(
List(application.InstallationContext),
),
contexts: option.Option(List(Context)),
)
}
Constructors
-
UserCommand( id: String, application_id: String, guild_id: option.Option(String), name: String, name_localizations: option.Option(dict.Dict(String, String)), default_member_permissions: option.Option( List(permission.Permission), ), is_nsfw: Bool, integration_types: option.Option( List(application.InstallationContext), ), contexts: option.Option(List(Context)), )Arguments
- default_member_permissions
-
None -> All members can use it.
- integration_types
-
None -> Your application’s installation contexts for the scope in which the command is ran.
Values
pub fn bulk_overwrite_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
new commands: List(CreateForGuild),
) -> Result(List(Command), grom.Error)
pub fn bulk_overwrite_global(
client: grom.Client,
of application_id: String,
new commands: List(CreateGlobal),
) -> Result(List(Command), grom.Error)
pub fn create_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
using create: CreateForGuild,
) -> Result(Command, grom.Error)
pub fn create_global(
client: grom.Client,
for application_id: String,
using create: CreateGlobal,
) -> Result(Command, grom.Error)
pub fn create_message_command_for_guild_to_json(
create: CreateMessageCommandForGuild,
) -> json.Json
pub fn delete_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
id command_id: String,
) -> Result(Nil, grom.Error)
pub fn delete_global(
client: grom.Client,
of application_id: String,
id command_id: String,
) -> Result(Nil, grom.Error)
pub fn get_all_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
) -> Result(List(Command), grom.Error)
pub fn get_all_global(
client: grom.Client,
for application_id: String,
) -> Result(List(Command), grom.Error)
pub fn get_all_guild_permissions(
client: grom.Client,
of application_id: String,
in guild_id: String,
) -> Result(List(GuildPermissions), grom.Error)
pub fn get_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
id command_id: String,
) -> Result(Command, grom.Error)
pub fn get_global(
client: grom.Client,
of application_id: String,
id command_id: String,
) -> Result(Command, grom.Error)
pub fn get_guild_permissions(
client: grom.Client,
of application_id: String,
in guild_id: String,
for command_id: String,
) -> Result(GuildPermissions, grom.Error)
pub fn modify_for_guild(
client: grom.Client,
application application_id: String,
guild guild_id: String,
id command_id: String,
using modify: ModifyForGuild,
) -> Result(Command, grom.Error)
pub fn modify_global(
client: grom.Client,
of application_id: String,
id command_id: String,
using modify: ModifyGlobal,
) -> Result(Command, grom.Error)
pub fn new_create_global_message_command(
named name: String,
) -> CreateGlobalMessageCommand
pub fn new_create_global_slash_command(
named name: String,
description description: String,
) -> CreateGlobalSlashCommand
pub fn new_create_global_user_command(
named name: String,
) -> CreateGlobalUserCommand
pub fn new_create_message_command_for_guild(
named name: String,
) -> CreateMessageCommandForGuild
pub fn new_create_slash_command_for_guild(
named name: String,
description description: String,
) -> CreateSlashCommandForGuild
pub fn new_create_user_command_for_guild(
named name: String,
) -> CreateUserCommandForGuild
pub fn new_integer_choice(
named name: String,
value value: Int,
) -> IntegerChoice
pub fn new_modify_global() -> ModifyGlobal
pub fn new_number_choice(
named name: String,
value value: Float,
) -> NumberChoice
pub fn new_parameter_attachment(
named name: String,
description description: String,
) -> ParameterAttachment
pub fn new_parameter_boolean(
named name: String,
description description: String,
) -> ParameterBoolean
pub fn new_parameter_channel(
named name: String,
description description: String,
) -> ParameterChannel
pub fn new_parameter_integer(
named name: String,
description description: String,
) -> ParameterInteger
pub fn new_parameter_mentionable(
named name: String,
description description: String,
) -> ParameterMentionable
pub fn new_parameter_number(
named name: String,
description description: String,
) -> ParameterNumber
pub fn new_parameter_role(
named name: String,
description description: String,
) -> ParameterRole
pub fn new_parameter_sub_command(
named name: String,
description description: String,
) -> ParameterSubCommand
pub fn new_parameter_sub_command_group(
named name: String,
description description: String,
sub_commands parameters: List(Parameter),
) -> ParameterSubCommandGroup
pub fn new_parameter_text(
named name: String,
description description: String,
) -> ParameterText
pub fn new_parameter_user(
named name: String,
description description: String,
) -> ParameterUser
pub fn new_text_choice(
named name: String,
value value: String,
) -> TextChoice
pub fn parameter_sub_command_group_to_json(
parameter: ParameterSubCommandGroup,
) -> json.Json