2016-04-05 4 views
1

Ich bastle mit ExIrc, um einen einfachen Bot zu machen, aber ich kann es nicht funktionieren lassen.Starten von ExIrc-Supervisor schlägt fehl

Ich bekomme diese Fehler:

** (Mix) Could not start application streamingutils: TwitchSniper.start(:normal, 
[]) returned an error: shutdown: failed to start child: TwitchSniper.Bot 
    ** (EXIT) an exception was raised: 
     ** (ArgumentError) argument error 
      :erlang.apply([%TwitchSniper.Bot.State{client: nil, handlers: [], host: "irc.chat.twitch.tv", name: "Paul Schoenfelder", nick: "hajtosek", pass: "my password", port: 6667, user: "hajtosek"}], :host, []) 
      (streamingutils) TwitchSniper.Bot.init/1 
      (stdlib) gen_server.erl:328: :gen_server.init_it/6 
      (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3 

Ich habe versucht, ExIrc Bibliothek zu verwenden: https://github.com/bitwalker/exirc

ich nur kopiert Großteil des Codes aus der Readme, nur getauscht Daten

-Code :

defmodule State do 
    defstruct host: "irc.chat.twitch.tv", 
       port: 6667, 
       pass: "password", 
       nick: "hajtosek", 
       user: "hajtosek", 
       name: "Paul Schoenfelder", 
       client: nil, 
       handlers: [] 
end 

def start_link(_) do 
    GenServer.start_link(__MODULE__, [%State{}]) 
end 

def init(state) do 
    # Start the client and handler processes, the ExIrc supervisor is automatically started when your app runs 
    {:ok, client} = ExIrc.start_client!() 
    #{:ok, handler} = ExampleHandler.start_link(nil) 

    # Register the event handler with ExIrc 
    ExIrc.Client.add_handler client, self 

    # Connect and logon to a server, join a channel and send a simple message 
    ExIrc.Client.connect! client, state.host, state.port 
    ExIrc.Client.logon  client, state.pass, state.nick, state.user, state.name 
    ExIrc.Client.join  client, "#channel" 
    ExIrc.Client.msg  client, :privmsg, "#channel", "Hello world!" 
    ExIrc.Client.msg  client, :ctcp, "#channel", "Hello world!" 

    IO.inspect "IRC activated" 

    {:ok, %{state | :client => client, :handlers => [self]}} 
end 

def terminate(_, state) do 
    # Quit the channel and close the underlying client connection when the process is terminating 
    ExIrc.Client.quit state.client, "Goodbye, cruel world." 
    ExIrc.Client.stop! state.client 
    :ok 
end 

Antwort

2

Dies scheint ein Tippfehler in der README. Das Argument state zu init ist immer eine Liste (es erhält die Liste GenServer.start_link). Das Problem ist also, dass Sie versuchen, den Zustand wie eine Struktur zu verwenden, wenn es nicht eine ist. Ändern Sie einfach den Funktionskopf für init zu [state] statt state und Sie werden gut gehen.

EDIT: Beachten Sie auch, dass Sie im Beispiel-Ordner auf GitHub für vollständige Anwendungen, die exirc verwenden, sehen sollten, sind sie realistischere Beispiele.

+0

Vielen Dank, ich muss dem Autor der Lib Bericht erstatten. – Haito

+0

Ich bin der Autor der lib, also berichte darüber berichtet;) – bitwalker