async def movie_details(self, ctx: SlashContext, title: str):
        try:
            await ctx.defer()
            details = self.movie.get_movie_rates(title)

            embed_msg = embeds.Embed(
                title="{} - {}".format(details["name"],
                                       details["averageRate"]),
                description="seen : " +
                self.__convert_movie_date__(details["seen"]),
                colour=EMBEDDED_COLOR)
            for detail in details["spectatorRates"]:
                embed_msg.add_field(name=detail["spectator"],
                                    value=detail["rate"],
                                    inline=False)

            await utils.send_embedded(self.movie_channel(), embed_msg)
            await utils.send_empty_message(ctx)

        except msqbot_error.MsqDataBaseError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.NoMovieFound as e:
            await utils.send_error(ctx, e.message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)
    async def too_watch_movies(self, ctx: SlashContext):
        try:
            await ctx.defer()
            movies = self.movie.get_unseen_movie()
            paginator = CustomPaginator()
            paged_movies = paginator.divide_into_page(movies)
            embeds_pages = []

            for page in paged_movies:
                embed_msg = embeds.Embed(
                    title="To Watch List",
                    description="movies yet to be seen",
                    colour=EMBEDDED_COLOR).set_footer(text="{}/{}".format(
                        paged_movies.index(page) + 1, paginator.nb_pages + 1))
                for movie in page:
                    embed_msg.add_field(name=movie["name"],
                                        value="added: {}".format(
                                            self.__convert_movie_date__(
                                                movie["added"])),
                                        inline=False)
                embeds_pages.append(embed_msg)

            await paginator.start(ctx, embeds_pages)
            await utils.send_empty_message(ctx)

        except msqbot_error.MsqDataBaseError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.NoUnseenMovieFound as e:
            await utils.send_success(ctx, e.message)
    async def movie_list(self,
                         ctx: SlashContext,
                         sort: str = None,
                         direction: str = None):
        try:
            await ctx.defer()

            # try all combination to avoid sending incomplete query
            movies = None
            if sort is None and direction is None:
                movies = self.movie.get_list_movies_by()
            elif sort != None and direction is None:
                movies = self.movie.get_list_movies_by(sort=sort)
            elif direction != None and sort is None:
                movies = self.movie.get_list_movies_by(growth=direction)
            else:
                movies = self.movie.get_list_movies_by(sort, direction)

            paginator = CustomPaginator()
            paged_movies = paginator.divide_into_page(movies)
            embeds_pages = []

            for page in paged_movies:
                message = embeds.Embed(
                    title="Movie List",
                    description="sorted by {}".format(
                        sort if sort is not None else "default"),
                    colour=EMBEDDED_COLOR).set_footer(text="{}/{}".format(
                        paged_movies.index(page) + 1, paginator.nb_pages + 1))
                for movie in page:
                    message.add_field(
                        name="{} - {}".format(
                            movie["name"], movie["average_rate"]
                            if movie["average_rate"] is not None else "-"),
                        value="added: {} | seen: {}".format(
                            self.__convert_movie_date__(movie["added"]),
                            self.__convert_movie_date__(movie["seen"])),
                        inline=False)
                embeds_pages.append(message)

            await paginator.start(ctx, embeds_pages)
            await utils.send_empty_message(ctx)

        except msqbot_error.MSQbotError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.NoMovieFound as e:
            await utils.send_success(ctx, e.message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)
    async def add_new_movie(self, ctx: SlashContext, title: str):
        try:
            await ctx.defer()
            self.movie.add_movie(title)
            await utils.send_success(
                ctx, "'{}' has been added to the list".format(title))

        except msqbot_error.MSQbotError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(msqbot_error.MSQbotError().message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)
    async def change_movie_name(self, ctx: SlashContext, current_title: str,
                                new_title: str):
        try:
            await ctx.defer()
            self.movie.change_movie_name(current_title, new_title)
            await utils.send_success(
                ctx,
                "The changed from '{}' to '{}'".format(current_title,
                                                       new_title))

        except msqbot_error.MSQbotError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)
    async def random_movie(self, ctx):
        try:
            random_movie = self.movie.get_random_movie()

            embed_msg = embeds.Embed(colour=EMBEDDED_COLOR)
            embed_msg.add_field(name=random_movie["name"],
                                value="added: {}".format(
                                    self.__convert_movie_date__(
                                        random_movie["added"])))

            await utils.send_embedded(self.movie_channel(), embed_msg)
            await utils.send_empty_message(ctx)

        except msqbot_error.MsqDataBaseError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.NoUnseenMovieFound as e:
            await utils.send_success(ctx, e.message)
    async def rate_movie(self, ctx: SlashContext, title: str, rate: str):
        try:
            await ctx.defer()
            movie_rate = float(rate)
            spectator_id = int(ctx.author.id)
            spectator_name = ctx.author.name

            self.movie.rate_movie(movie_rate, spectator_id, spectator_name,
                                  title)
            await utils.reply_interaction(
                ctx, "{} gave a rate of **{}/10** to **{}**".format(
                    spectator_name, movie_rate, title))

        except msqbot_error.MSQbotError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.InvalidRate as e:
            await utils.send_error(ctx, e.message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)
    async def spectator_details(self, ctx: SlashContext, spectator: str):
        try:
            await ctx.defer()
            spectator_id = utils.get_id_from_tag(self.bot, spectator)
            details = self.movie.get_spectator_details(spectator_id)
            paginator = CustomPaginator()
            paged_movies = paginator.divide_into_page(
                details["spectatorRates"])
            embeds_pages = []

            for page in paged_movies:
                embed_msg = embeds.Embed(
                    title=details["name"],
                    description="average rate : " +
                    str(details["averageRate"]),
                    colour=EMBEDDED_COLOR).set_footer(text="{}/{}".format(
                        paged_movies.index(page) + 1, paginator.nb_pages + 1))
                for detail in page:
                    embed_msg.add_field(name=detail["movie"],
                                        value=detail["rate"],
                                        inline=False)
                embeds_pages.append(embed_msg)

            await paginator.start(ctx, embeds_pages)
            await utils.send_empty_message()

        except msqbot_error.MsqDataBaseError:
            logging.exception(ERROR_PREFIX, exc_info=True)
            await utils.send_error(ctx, msqbot_error.MSQbotError().message)

        except movie_error.NoMovieFound as e:
            await utils.send_error(ctx, e.message)

        except commands.errors.MissingRequiredArgument:
            await utils.send_error(ctx,
                                   msqbot_error.NoParameterGiven().message)