Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Informationen des ausgewählten Users.
#11
Hey,
ich bin es mal wieder.
Ich habe nun folgenden Code:
static void call_user(PurpleBlistNode *node) {
// test();
if(!(purple_blist_node_get_type(node) == PURPLE_BLIST_BUDDY_NODE)) {
return;
}

const char *userInfo;

PurpleBuddy *buddy = (PurpleBuddy*) node;
PurpleAccount *p = purple_buddy_get_account(buddy);

userInfo = userInfo = purple_account_get_username(p);

purple_notify_message(NULL, PURPLE_NOTIFY_MSG_INFO, "Call a Buddy", userInfo, "", NULL, NULL);
}

Dies ist meine Callback-Funktion, die aufgerufen wird, wenn der Eintrag im Context-Menü geklickt wurde.
Das Problem bei diesem Code ist:
Er zeigt mir den Usernamen von meinem Account an und nicht von dem angeklickten User.
Findet jemand von euch vielleicht den Fehler?


Vielen Dank.
LG James
Zitieren
#12
Steht doch eindeutig da: du holst dir mit purple_buddy_get_account() den Account vom Buddy und lässt dir dann mit purple_account_get_username() den Nutzernamen des Accounts zurückgeben.

Was du suchst heißt purple_buddy_get_name() [1].

[1] https://developer.pidgin.im/doxygen/2.0....d6d415136c
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#13
Das ist mir klar, das ist aber MEIN Username und nicht der des Users, den ich ausgewählt habe?!?

Hey,

ich habe mal eben nach meiner Mittagspause eine Ausgabe von purple_buddy_get_account() implementiert. Ich bekomme wie erwartet den Namen Smile
Mein eigentliches Ziel war es aber, die User-Informationen zu erhalten, also die Telefon-Nummer, die Stadt usw.
Kennst du da vielleicht etwas?

Vielen Dank!
LG James
Zitieren
#14
Das ist komplizierter. Da gibt es nichts vorgefertigtes. Die einzige Idee, die ich habe ist die, die ich schonmal im Birthday Reminder für die Geburtstage umgesetzt habe. Aber die ist zum einen nicht schön und zum anderen bin ich selbst gespannt, ob das mit Pidgin 3 noch so funktioniert.

Die gesuchten Informationen kommen direkt vom Protokoll-Plugin. Die libpurple und Pidgin haben eigentlich gar keine Ahnung, was die Informationen eigentlich bedeuten. Wenn du also Rechtsklick -> Info machst, sagt das Plugin der libpurple "Hier hast du eine Liste von Zeichenketten, bitte mal anzeigen". Und die libpurple gibt das dann genau so an Pidgin weiter. Nun muss man noch wissen, wie die libpurple und Pidgin miteinander verbunden sind. Beim Start übergibt Pidgin der libpurple ein Datenfeld (struct) mit Zeigern auf Funktionen, die libpurple dann unter gewissen Umständen aufruft. Das sind die sogenannten ui_ops ("user interface operations" oder so ähnlich). Diese Zeiger lassen sich von einem Plugin aus verändern. Die Funktion, die dich interessiert heißt notify_userinfo.

Der Plan ist also folgender:
- Wenn jemand auf deinen Menüpunkt klickt, musst du dem Protokoll vorgaukeln, er hätte auf "Info" geklickt. Das passiert bei mir in [1], Zeile 73.
- Danach wird das Protokoll sein Ding machen und Infos irgendwo abholen. Wenn die Infos da sind, gibt es der libpurple die Infos, die wiederum die Funktion notify_userinfo aus den ui_ops aufruft, um Pidgin Bescheid zu geben. Die ui_ops musst du vorher manipuliert haben, sodass eine Funktion von dir aufgerufen und die Informationen dann bei dir ankommen. Das passiert bei mir in den Zeilen 175 bis 177.

[1] http://bazaar.launchpad.net/~konradgraef...src/scan.c
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#15
Hey ich danke dir für deine Antwort. Ich habe mir das ein bisschen angeschaut und komme nicht so ganz weiter, dies werde ich aber am Montag schreiben. Muss jetzt los. Wollte nur mal kurz signalisieren, dass ich deinen Beitrag gelesen habe und mich kurz bedanken Big Grin
Zitieren
#16
Hallo,
ich habe nun folgende Methode. Das Problem mit dieser ist, dass es entweder direkt abstürzt, oder beim zweiten Mal absütrzt. Mit abstürzen meine ich, dass Pidgin nicht mehr reagiert und geschlossen werden muss. Ich habe mal versucht mit VisualStudio da etwas zu debuggen. Ergebnis: Access violation. Kannst du soetwas ermitteln? Ich habe dann mal die free´s eingebaut, um zu ermitteln ob es deswegen nicht klappt. Aber die Meldung kam trotzdem. Wenn du den kompletten Code brauchst, sag einfach Bescheid, ist aber eh nicht viel mehr Big Grin
(Hier auch mal ein Pastebin-Link, falls es zu unordentlich ist. )
Hier der Code:
[c]static void call_user(PurpleBlistNode *node) {

PurpleAccount *acc = NULL;
PurpleConnection *gc = NULL;
PurplePlugin *prpl = NULL;
PurplePluginProtocolInfo *prpl_info = NULL;
PurpleNotifyUiOps *ops;

purple_debug_warning("plugin-call-a-buddy", "Variablen wurden initialisiert.\n");

const char *name = NULL;

PurpleBuddy *buddy = (PurpleBuddy*) node;
acc = purple_buddy_get_account(buddy);

purple_debug_warning("plugin-call-a-buddy", "Node Konvertiert und Acc geholt.\n");

gc = acc->gc;
purple_debug_warning("plugin-call-a-buddy", "GC wird geholt.\n");
if(!gc) {
return;
}

prpl = purple_connection_get_prpl(gc);
purple_debug_warning("plugin-call-a-buddy", "Hole Protocol.\n");

if(!prpl) {
return;
}

prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
purple_debug_warning("plugin-call-a-buddy", "Plugin_Protocol_INFO wird geholt. \n");
if(!prpl_info || !prpl_info->get_info) {
return;
}

prpl_info->get_info(gc, name);
purple_debug_warning("plugin-call-a-buddy", "Entsprechende Infos werden ermittelt \n");

ops = purple_notify_get_ui_ops();
purple_debug_warning("plugin-call-a-buddy", "Notify_Get_UI_Ops \n");

notify_userinfo_ori = ops->notify_userinfo;
purple_debug_warning("plugin-call-a-buddy", (char*)notify_userinfo_ori);

ops->notify_userinfo = birthday_reminder_notify_userinfo;
purple_debug_warning("plugin-call-a-buddy", "Birthday_Reminder_Notify_Userinfo \n");

if(!PURPLE_BLIST_NODE_IS_BUDDY(node)) {
purple_debug_fatal("plugin-call-a-buddy", "Es wird versucht einen Nicht-User anzurufen.\n");
return;
}
test();

// const char *userInfo;

free(acc);
free(gc);
free(prpl);
free(prpl_info);
free(ops);
free(buddy);

// PurpleBuddy *buddy = (PurpleBuddy*) node;
// PurpleAccount *p = purple_buddy_get_account(buddy);

// const char *name = purple_buddy_get_name(buddy);

}[/c]
Zitieren
#17
Wenn du die [ code][/code]-Tags benutzt, wird's auch im Forum lesbar, wobei ich eben noch eine Erweiterung installiert habe, die [ c][/c]-Tags verfügbar macht, dann wird's sogar bunt! \o/

Ich habe nicht so recht verstanden, was dein Code tut, aber die Zeilen 46 und 47 sehen komisch aus. Wink Wird denn dein Plugin ohne Fehler und Warnungen gebaut?
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#18
Guten Morgen,
Yay das ist sehr gut. Ich habe mich hier an den RTE gehalten und dort keine Code-Tags gefunden. Wobei hier ein Insert-PHP-Button ist Smile. Aber jetzt weiß ich ja, dass es auch etwas für C gibt. Kannst das ja vielleicht bei Gelegenheit mal hier in den RTE einbauen.

Zum Code: Ich habe einfach mal den Code von deinem Scan.c genommen und ein bisschen rauskopiert um zu gucken was passiert. Ja, das Plugin baut sich auf.

Du hast sicher schon gemerkt, das C neu für mich ist Smile

Aber wollen wir die beiden Zeilen doch mal durchgehen.

Diese Zeile ist etwas unschlüssig, ich glaube aber, dass das Ergebnis des Funktionsaufrufs in ops->notify_userinfo geschrieben wird. Nur weiß ich nicht, warum die Signatur nicht angegeben wird.
[c]
ops->notify_userinfo = birthday_reminder_notify_userinfo;
[/c]
Ich habe nämlich auch eine Funktion:
[c]
static void *birthday_reminder_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info)
[/c]


Das hier ist ja einfach eine Debug-Ausgabe.(Edit: Ich habe das Level-Warning genommen, um in der Debug-Ausgabe nach dem Level Filtern zu können. Dann habe ich nicht die störenden anderen Elemente und muss meine EInträge suchen, wobei ich natürlich auch nach dem Text plugin-call-a-buddy filtern könnte.)
[c]
purple_debug_warning("plugin-call-a-buddy", "Birthday_Reminder_Notify_Userinfo \n");
[/c]

Edit2:
Hier ist auch mal die oben angesprochene Funktion:
[c]
static void *birthday_reminder_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) {
// PurpleBuddy *buddy;
purple_debug_warning("plugin-call-a-buddy", "In der Funktion ..._notify_userinfo");

// if(current_scanned_buddy && (current_scanned_buddy->account == gc->account && purple_utf8_strcasecmp(current_scanned_buddy->name, who)==0)) {
// buddy = current_scanned_buddy;
// } else {
// return notify_userinfo_ori(gc, who, user_info);
// }

/* Translators: use %1$s for the buddy's nickname, %2$s for the account name and %3$s for the protocol name. */
// purple_debug_info("plugin-call-a-buddy", _("Buddy %s (Account: %s (%s)) scanned.\n"), purple_buddy_get_name(current_scanned_buddy), purple_account_get_username(current_scanned_buddy->account), purple_account_get_protocol_name(current_scanned_buddy->account));

// purple_debug_info("plugin-call-a-buddy", (char*) user_info);

// current_scanned_buddy = NULL;

/* Info-Fenster unterdrücken */
return NULL;
}
[/c]
Zitieren
#19
Gib mir doch mal den gesamten Code. Am besten als Dateianhang, falls das hier funktioniert. Und den Aufruf des Compilers gleich mit.

Programmierst du denn unter Linux?
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?

[Bild: pidginbanner.png]
Zitieren
#20
Hallo, ich entwickel unter Windows mit Visual Studio. Die Datei ist im Anhang.

LG


Angehängte Dateien
.txt   test.txt (Größe: 6.2 KB / Downloads: 219)
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste