|
12 | 12 | from .models import Event as SatoriEvent
|
13 | 13 | from .message import Message, RenderMessage
|
14 | 14 | from .models import InnerMessage as SatoriMessage
|
| 15 | +from .models import ArgvInteraction, ButtonInteraction |
15 | 16 | from .models import Guild, Login, Channel, ChannelType, InnerMember
|
16 | 17 |
|
17 | 18 | E = TypeVar("E", bound="Event")
|
@@ -39,6 +40,8 @@ class EventType(str, Enum):
|
39 | 40 | REACTION_ADDED = "reaction-added"
|
40 | 41 | REACTION_REMOVED = "reaction-removed"
|
41 | 42 | INTERNAL = "internal"
|
| 43 | + INTERACTION_BUTTON = "interaction/button" |
| 44 | + INTERACTION_COMMAND = "interaction/command" |
42 | 45 |
|
43 | 46 |
|
44 | 47 | class Event(BaseEvent, SatoriEvent):
|
@@ -423,3 +426,184 @@ class InternalEvent(Event):
|
423 | 426 | @override
|
424 | 427 | def get_event_name(self) -> str:
|
425 | 428 | return getattr(self, "_type", "internal")
|
| 429 | + |
| 430 | + |
| 431 | +class InteractionEvent(NoticeEvent): |
| 432 | + def convert(self) -> "InteractionEvent": |
| 433 | + raise NotImplementedError |
| 434 | + |
| 435 | + @override |
| 436 | + def is_tome(self) -> bool: |
| 437 | + return True |
| 438 | + |
| 439 | + |
| 440 | +@register_event_class |
| 441 | +class InteractionButtonEvent(InteractionEvent): |
| 442 | + __type__ = EventType.INTERACTION_BUTTON |
| 443 | + |
| 444 | + button: ButtonInteraction |
| 445 | + |
| 446 | + @override |
| 447 | + def get_event_description(self) -> str: |
| 448 | + return escape_tag(f"Button interacted with button#{self.button.id}") |
| 449 | + |
| 450 | + def convert(self): |
| 451 | + if self.channel and self.user and self.channel.type != ChannelType.DIRECT: |
| 452 | + return PublicInteractionButtonEvent.parse_obj(self) |
| 453 | + if self.user: |
| 454 | + return PrivateInteractionButtonEvent.parse_obj(self) |
| 455 | + return self |
| 456 | + |
| 457 | + |
| 458 | +class PrivateInteractionButtonEvent(InteractionButtonEvent): |
| 459 | + user: User |
| 460 | + |
| 461 | + @override |
| 462 | + def get_session_id(self) -> str: |
| 463 | + return self.channel.id if self.channel else self.user.id |
| 464 | + |
| 465 | + @override |
| 466 | + def get_user_id(self) -> str: |
| 467 | + return self.user.id |
| 468 | + |
| 469 | + |
| 470 | +class PublicInteractionButtonEvent(InteractionButtonEvent): |
| 471 | + user: User |
| 472 | + channel: Channel |
| 473 | + |
| 474 | + @override |
| 475 | + def get_session_id(self) -> str: |
| 476 | + s = f"{self.channel.id}/{self.user.id}" |
| 477 | + if self.guild: |
| 478 | + s = f"{self.guild.id}/{s}" |
| 479 | + return s |
| 480 | + |
| 481 | + @override |
| 482 | + def get_user_id(self) -> str: |
| 483 | + return self.user.id |
| 484 | + |
| 485 | + |
| 486 | +@register_event_class |
| 487 | +class InteractionCommandEvent(InteractionEvent): |
| 488 | + __type__ = EventType.INTERACTION_COMMAND |
| 489 | + |
| 490 | + if TYPE_CHECKING: |
| 491 | + _message: Message |
| 492 | + original_message: Message |
| 493 | + |
| 494 | + @override |
| 495 | + def get_type(self) -> str: |
| 496 | + return "message" |
| 497 | + |
| 498 | + @override |
| 499 | + def get_message(self) -> Message: |
| 500 | + return self._message |
| 501 | + |
| 502 | + def convert(self): |
| 503 | + if self.argv: |
| 504 | + return InteractionCommandArgvEvent.convert(self) # type: ignore |
| 505 | + return InteractionCommandMessageEvent.convert(self) # type: ignore |
| 506 | + |
| 507 | + |
| 508 | +class InteractionCommandArgvEvent(InteractionCommandEvent): |
| 509 | + argv: ArgvInteraction |
| 510 | + |
| 511 | + @override |
| 512 | + def get_event_description(self) -> str: |
| 513 | + return escape_tag(f"Command interacted with {self.argv}") |
| 514 | + |
| 515 | + @root_validator |
| 516 | + def generate_message(cls, values: Dict[str, Any]) -> Dict[str, Any]: |
| 517 | + argv: ArgvInteraction = values["argv"] |
| 518 | + cmd = argv.name |
| 519 | + if argv.arguments: |
| 520 | + cmd += " ".join(argv.arguments) |
| 521 | + values["_message"] = Message(cmd) |
| 522 | + values["original_message"] = deepcopy(values["_message"]) |
| 523 | + return values |
| 524 | + |
| 525 | + def convert(self): |
| 526 | + if self.channel and self.user and self.channel.type != ChannelType.DIRECT: |
| 527 | + return PublicInteractionCommandArgvEvent.parse_obj(self) |
| 528 | + if self.user: |
| 529 | + return PrivateInteractionCommandArgvEvent.parse_obj(self) |
| 530 | + return self |
| 531 | + |
| 532 | + |
| 533 | +class PrivateInteractionCommandArgvEvent(InteractionCommandArgvEvent): |
| 534 | + user: User |
| 535 | + |
| 536 | + @override |
| 537 | + def get_session_id(self) -> str: |
| 538 | + return self.channel.id if self.channel else self.user.id |
| 539 | + |
| 540 | + @override |
| 541 | + def get_user_id(self) -> str: |
| 542 | + return self.user.id |
| 543 | + |
| 544 | + |
| 545 | +class PublicInteractionCommandArgvEvent(InteractionCommandArgvEvent): |
| 546 | + user: User |
| 547 | + channel: Channel |
| 548 | + |
| 549 | + @override |
| 550 | + def get_session_id(self) -> str: |
| 551 | + s = f"{self.channel.id}/{self.user.id}" |
| 552 | + if self.guild: |
| 553 | + s = f"{self.guild.id}/{s}" |
| 554 | + return s |
| 555 | + |
| 556 | + @override |
| 557 | + def get_user_id(self) -> str: |
| 558 | + return self.user.id |
| 559 | + |
| 560 | + |
| 561 | +class InteractionCommandMessageEvent(InteractionCommandEvent): |
| 562 | + message: SatoriMessage |
| 563 | + to_me: bool = False |
| 564 | + reply: Optional[RenderMessage] = None |
| 565 | + |
| 566 | + @root_validator |
| 567 | + def generate_message(cls, values: Dict[str, Any]) -> Dict[str, Any]: |
| 568 | + values["_message"] = Message.from_satori_element(values["message"].content) |
| 569 | + values["original_message"] = deepcopy(values["_message"]) |
| 570 | + return values |
| 571 | + |
| 572 | + @override |
| 573 | + def get_event_description(self) -> str: |
| 574 | + return escape_tag(f"Command interacted with {self.get_message()}") |
| 575 | + |
| 576 | + def convert(self): |
| 577 | + if self.channel and self.user and self.channel.type != ChannelType.DIRECT: |
| 578 | + return PublicInteractionCommandMessageEvent.parse_obj(self) |
| 579 | + if self.user: |
| 580 | + return PrivateInteractionCommandMessageEvent.parse_obj(self) |
| 581 | + return self |
| 582 | + |
| 583 | + |
| 584 | +class PrivateInteractionCommandMessageEvent(InteractionCommandMessageEvent): |
| 585 | + user: User |
| 586 | + |
| 587 | + @override |
| 588 | + def get_session_id(self) -> str: |
| 589 | + return self.channel.id if self.channel else self.user.id |
| 590 | + |
| 591 | + @override |
| 592 | + def get_user_id(self) -> str: |
| 593 | + return self.user.id |
| 594 | + |
| 595 | + |
| 596 | +class PublicInteractionCommandMessageEvent(InteractionCommandMessageEvent): |
| 597 | + user: User |
| 598 | + channel: Channel |
| 599 | + |
| 600 | + @override |
| 601 | + def get_session_id(self) -> str: |
| 602 | + s = f"{self.channel.id}/{self.user.id}" |
| 603 | + if self.guild: |
| 604 | + s = f"{self.guild.id}/{s}" |
| 605 | + return s |
| 606 | + |
| 607 | + @override |
| 608 | + def get_user_id(self) -> str: |
| 609 | + return self.user.id |
0 commit comments