NyangBotLab / DBManager_deploy

Easy to use Kakaotalk bot database module✨
Other
24 stars 6 forks source link

DBManager 안에서 카카오링크 호환되지 않음. #16

Closed devminho5 closed 1 month ago

devminho5 commented 1 month ago

트러블 슈팅

https://github.com/naijun0403/kakaolink 를 기반으로 한 카카오링크 전송 시,

1. DBListener 안에서 직접 전송

DBListener.on('message', (chat, channel) => {
  if (chat.text.startsWith('!테스트')) {
    client.sendLink(chat.channel.name, {
        templateId: 1, // your template id
        templateArgs: {},
    }, 'custom').awaitResult();
  }
});

2. DBListener 안에서 response로 임의의 값을 보내고 response에서 해당 값 수신 시 카카오링크 전송

DBListener.on('message', (chat, channel) => {
    if (chat.text.startsWith('!테스트')) {
        responseFix('테스트');
    }
});

/*
* 아래에서 DBDBDEEP은 DBListner 안에서 !테스트 입력 시 받은 '테스트' 값을 받을 파라미터
*/

function responseFix(room, roomId, msg, msgId, sender, isGroupChat, replier, imageDB, packageName, userId, id2, DBDBDEEP) {
    if (DBDBDEEP === '테스트') {
        client.sendLink(room, {
        templateId: 1, // your template id
        templateArgs: {},
        }, 'custom').awaitResult();
    }
}

function createReplier(packageName, action, room) {
    return new com.xfl.msgbot.script.api.legacy.SessionCacheReplier(packageName, action, room, false, "");
  }

  function createImageDB(icon, image) {
    return new com.xfl.msgbot.script.api.legacy.ImageDB(icon, image);
  }

  function onNotificationPosted(sbn, sm) {
    var packageName = sbn.getPackageName();
    if (!packageName.startsWith("com.kakao.tal")) return;

    var actions = sbn.getNotification().actions;
    if (actions == null) return;

    var userId = sbn.getUser().hashCode();

    for (var n = 0; n < actions.length; n++) {
      var action = actions[n];
      if (action.getRemoteInputs() == null) continue;

      var notification = sbn.getNotification();
      var bundle = notification.extras;

      var roomId = notification.getShortcutId();
      var userId2 = bundle.getParcelableArray("android.messages")[0].get("sender_person").getKey();
      var msg = bundle.get("android.text").toString();
      var sender = bundle.getString("android.title");
      var msgId = bundle.get("chatLogId");
      var room = bundle.getString("android.subText") || bundle.getString("android.summaryText") || sender;
      var isGroupChat = room != null;

      var replier = createReplier(packageName, action, room);

      var icon = bundle.getParcelableArray("android.messages")[0].get("sender_person").getIcon().getBitmap();
      var image = bundle.getBundle("android.wearable.EXTENSIONS");
      if (image != null) image = image.getParcelable("background");

      var imageDB = createImageDB(icon, image);

      com.xfl.msgbot.application.service.NotificationListener.Companion.setSession(packageName, room, action);

      if (this.hasOwnProperty("responseFix")) {
        responseFix(room, roomId, msg, msgId, sender, isGroupChat, replier, imageDB, packageName, userId != 0, userId2);
      }
    }
}

모두 시도해보았지만, 작동하지 않습니다. DBManager와 카카오링크 모듈 모두 너무도 감사히 잘 쓰고 있습니다만, 두 가지 모듈이 서로 호환되면 더 기쁠 것 같은 마음에 글 올리게 되었습니다.

구동 환경

디버깅 정보

없음. 에러가 발생하여 스크립트가 꺼지거나 하지 않고, 해당 부분만 코드 자체에서 무시되어 실행됨.

AlphaDoStar commented 1 month ago

2. responseFix를 직접 호출하는 경우

테스트 코드가 잘못된 것 같습니다. DBDBDEEPresponseFix의 마지막 파라미터인데, 첫 번째 인자에 '테스트'를 넘겨줬기 때문에 당연히 작동하지 않습니다.

확인해 보시면 정확한 원인을 확인할 수 있을 것 같아요.

devminho5 commented 1 month ago

2. responseFix를 직접 호출하는 경우

테스트 코드가 잘못된 것 같습니다. DBDBDEEPresponseFix의 마지막 파라미터인데, 첫 번째 인자에 '테스트'를 넘겨줬기 때문에 당연히 작동하지 않습니다.

  • DBListener가 카카오링크가 아닌 단순 응답을 사용하는 경우에도 작동하는지
  • responseFix를 올바르게 호출하는 코드로 수정하였을 때 client.sendLink가 작동하는지

확인해 보시면 정확한 원인을 확인할 수 있을 것 같아요.

아래와 같은 코드로 다시금 테스트해보았지만, 여전히 작동하지 않습니다 :(

DBListener.on('message', (chat, channel) => {
    if (chat.text.startsWith('!테스트')) {
        let sendKakaoLink = Array(11).fill(null);
        sendKakaoLink.push('테스트');
        responseFix.apply(null, sendKakaoLink);
    }
});

function responseFix(room, roomId, msg, msgId, sender, isGroupChat, replier, imageDB, packageName, userId, id2, DBDBDEEP) {
  if (DBDBDEEP === '테스트') {
    client.sendLink(room, {
        templateId: 000000, // your template id
        templateArgs: {
        },
    }, 'custom').awaitResult();
  }
}

templateId는 실제 Kakao Developers에 등록된 템플릿 ID와 templateArgs도 그에 맞게 적절히 수정했습니다. 사용한 카카오링크 모듈은 https://github.com/naijun0403/kakaolink/releases/tag/2.0.0-beta05 (현재 시점 가장 최신 버전) 입니다.