?? unit1.~pas
字號:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, Menus, ToolWin,
OpenNet, eTransportIRC;
const
WM_ETRANSPORT = WM_APP + 8192;
CHANNEL = '#mp3friends';
CHANNEL_SIZE = 12;
type
PChannel = ^TChannel;
TChannel = record
channel : string;
topic : string;
send_text : string;
text : TStringList;
nicks : TStringList;
end;
TForm1 = class(TForm)
TabControl1: TTabControl;
Panel4: TPanel;
Panel3: TPanel;
Edit1: TEdit;
Timer1: TTimer;
MainMenu1: TMainMenu;
File1: TMenuItem;
Connect1: TMenuItem;
Options1: TMenuItem;
Exit1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
StatusBar1: TStatusBar;
ToolBar1: TToolBar;
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
ListBox1: TListBox;
Panel5: TPanel;
ScrollBar1: TScrollBar;
Memo1: TMemo;
procedure Panel3Resize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Connect1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure TabControl1Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
m_transport : TRANSPORT_HANDLE;
m_channels : array of TChannel;
m_send_text : string;
m_widths : array[0..255] of Byte;
m_height : integer;
private
function FindChannel(channel : string) : PChannel;
procedure SendString(channel, message : string);
procedure CallbackSystem(handle : TRANSPORT_HANDLE; event : PEpEvent);
procedure CallbackIRC(handle : TRANSPORT_HANDLE; event : PEpEvent);
procedure Callback(handle : TRANSPORT_HANDLE; event : PEpEvent); virtual;
procedure InternalCallback(var msg : TMessage); message WM_ETRANSPORT;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// ---------------------------------------------------------------------------
procedure TransCallback(handle : TRANSPORT_HANDLE; event : PEpEvent; data : Pointer); stdcall;
begin
SendMessage(Form1.Handle, WM_ETRANSPORT, Integer(handle), Integer(event));
end;
// ---------------------------------------------------------------------------
procedure TForm1.Panel3Resize(Sender: TObject);
begin
Edit1.Left := 0;
Edit1.Top := 0;
Edit1.Width := Panel3.Width;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
EpInit;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
EpFinalize;
end;
procedure TForm1.InternalCallback(var msg : TMessage);
begin
Callback(TRANSPORT_HANDLE(msg.wparam), PEpEvent(msg.lparam));
end;
function TForm1.FindChannel(channel : string) : PChannel;
var
i : integer;
begin
// find the channel, if found, then add the text to it
for i := 0 to Length(m_channels) - 1 do
if m_channels[i].channel = string(channel) then
begin
Result := @m_channels[i];
Exit;
end;
// channel not found... add a new channel
i := Length(m_channels);
SetLength(m_channels, i + 1);
m_channels[i].channel := channel;
m_channels[i].text := TStringList.Create;
m_channels[i].nicks := TStringList.Create;
TabControl1.Tabs.Add(channel);
TabControl1.TabIndex := i + 1;
TabControl1Change(self);
Result := @m_channels[i];
end;
procedure TForm1.SendString(channel, message : string);
var
ch : PChannel;
begin
ch := FindChannel(channel);
if ch <> nil then
begin
ch^.text.Append(message);
if ch.channel = channel then
Memo1.Lines.Append(message);
end;
end;
procedure TForm1.CallbackSystem(handle : TRANSPORT_HANDLE; event : PEpEvent);
var
action : EpAction;
user : IRCUser;
conn_data : PConnection;
begin
case SYSTEM_PROTOCOL(event.msg) of
SYSTEM_CONNECTION_CHANGED :
begin
conn_data := PConnection(event.data);
if conn_data^ = ECS_CONNECTED then
begin
Memo1.Lines.Append('Connected');
action.protocol := CLSID_IRC_PROTOCOL;
action.msg := Integer(IRC_CMD_PASS);
action.data := PByte(PChar('40968192'));
action.size := 9;
action.timeout := 0;
EpSendAction(handle, @action);
action.msg := Integer(IRC_CMD_NICK);
action.data := PByte(PChar('NoEscom-'));
action.size := 9;
EpSendAction(handle, @action);
user.username := PChar('guest');
user.hostname := PChar('tolmoon');
user.servername := PChar('tolsun');
user.realname := PChar('Floris van den Berg');
action.msg := Integer(IRC_CMD_USER);
action.data := @user;
action.size := sizeof(IRCUser);
EpSendAction(handle, @action);
end;
end;
SYSTEM_DATA_IN :
begin
Memo1.Lines.Append('data in');
end;
SYSTEM_SENT_SUCCEEDED :
begin
Memo1.Lines.Append('sent succceeded');
end;
end;
end;
procedure TForm1.CallbackIRC(handle : TRANSPORT_HANDLE; event : PEpEvent);
var
action : EpAction;
status_message : PIRCStatusMessage;
private_message : PIRCReplyPrivateMsg;
nick_entry : PIrcNick;
channel : PChannel;
i : integer;
begin
case IRC_PROTOCOL(event.msg) of
IRC_RAW :
begin
Memo1.Lines.Append('RAW - ' + PChar(event^.data));
end;
IRC_NOTICEAUTH :
begin
Memo1.Lines.Append(PChar(event^.data));
end;
IRC_PING :
begin
Memo1.Lines.Append('Ping? Pong!');
action.protocol := CLSID_IRC_PROTOCOL;
action.msg := Integer(IRC_CMD_PONG);
action.data := event^.data;
action.size := event^.size;
action.timeout := 0;
EpSendAction(handle, @action);
end;
IRC_STATUS_MESSAGE :
begin
status_message := PIRCStatusMessage(event^.data);
Memo1.Lines.Append(status_message^.message);
end;
IRC_PRIVMSG :
begin
private_message := PIRCReplyPrivateMsg(event^.data);
SendString(private_message^.channel, '<' + string(private_message^.nick) + '> ' + string(private_message^.message));
end;
IRC_NICK_ENTRY :
begin
nick_entry := PIrcNick(event^.data);
channel := FindChannel(nick_entry.channel);
if channel <> nil then
begin
if channel^.nicks.IndexOf(nick_entry^.nick) = -1 then
begin
channel^.nicks.Append(nick_entry^.nick);
if nick_entry^.channel = channel^.channel then
ListBox1.Items.Append(nick_entry^.nick);
end;
end;
end;
IRC_JOIN :
begin
nick_entry := PIrcNick(event^.data);
channel := FindChannel(nick_entry^.channel);
if channel <> nil then
begin
if channel^.nicks.IndexOf(nick_entry^.nick) = -1 then
begin
channel^.nicks.Append(nick_entry^.nick);
if nick_entry^.channel = channel^.channel then
ListBox1.Items.Append(nick_entry^.nick);
end;
SendString(nick_entry^.channel, '* ' + nick_entry^.nick + ' (' + nick_entry^.mask + ') has joined ' + nick_entry^.channel);
end;
end;
IRC_PART :
begin
nick_entry := PIrcNick(event^.data);
channel := FindChannel(nick_entry^.channel);
if channel <> nil then
begin
channel^.nicks.Delete(channel^.nicks.IndexOf(nick_entry^.nick));
if nick_entry^.channel = channel^.channel then
ListBox1.Items.Delete(ListBox1.Items.IndexOf(nick_entry^.nick));
SendString(nick_entry^.channel, '* ' + nick_entry^.nick + ' has left ' + nick_entry^.channel);
end;
end;
IRC_QUIT :
begin
nick_entry := PIrcNick(event^.data);
for i := 0 to Length(m_channels) - 1 do
begin
m_channels[i].nicks.Delete(m_channels[i].nicks.IndexOf(nick_entry^.nick));
m_channels[i].text.Append('* ' + nick_entry^.nick + ' has quit IRC (' + nick_entry^.channel + ')');
end;
ListBox1.Items.Delete(ListBox1.Items.IndexOf(nick_entry^.nick));
Memo1.Lines.Append('* ' + nick_entry^.nick + ' has quit IRC (' + nick_entry^.channel + ')');
end;
end;
end;
procedure TForm1.Callback(handle : TRANSPORT_HANDLE; event : PEpEvent);
begin
if IsEqualGuid(event^.protocol, CLSID_SYSTEM_PROTOCOL) then
CallbackSystem(handle, event)
else if IsEqualGuid(event^.protocol, CLSID_IRC_PROTOCOL) then
CallbackIRC(handle, event);
end;
procedure TForm1.Connect1Click(Sender: TObject);
begin
// RichEdit1.Lines.Append('* Connecting to amsterdam2.nl.eu.undernet.org (6667)');
m_transport := EpCreateTransport(CLSID_TRANSPORT_TCPIP, nil, TransCallback);
if (EpAddProtocol(m_transport, CLSID_IRC_PROTOCOL)) then
EpConnect(m_transport, 'haarlem.nl.eu.undernet.org', 6667, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
action : EpAction;
begin
action.protocol := CLSID_IRC_PROTOCOL;
action.msg := Integer(IRC_CMD_JOIN);
action.data := PByte(PChar(CHANNEL));
action.size := CHANNEL_SIZE;
action.timeout := 0;
EpSendAction(m_transport, @action);
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
action : EpAction;
message : IRCPrivateMessage;
begin
if Key = VK_RETURN then
begin
m_send_text := Edit1.Text;
Edit1.Text := '';
SendString(m_channels[TabControl1.TabIndex - 1].channel, '<NoEscom-> ' + m_send_text);
message.target := PChar(PChar(m_channels[TabControl1.TabIndex - 1].channel));
message.message := PChar(m_send_text);
action.protocol := CLSID_IRC_PROTOCOL;
action.msg := Integer(IRC_CMD_PRIVMSG);
action.data := @message;
action.size := sizeof(IRCPrivateMessage);
action.timeout := 0;
EpSendAction(m_transport, @action);
end;
end;
procedure TForm1.TabControl1Change(Sender: TObject);
var
i : integer;
begin
// RichEdit1.Clear;
if TabControl1.TabIndex > 0 then
begin
ListBox1.Clear;
for i := 0 to m_channels[TabControl1.TabIndex - 1].nicks.Count - 1 do
ListBox1.Items.Append(m_channels[TabControl1.TabIndex - 1].nicks[i]);
// for i := 0 to m_channels[TabControl1.TabIndex - 1].text.Count - 1 do
// RichEdit1.Lines.Append(m_channels[TabControl1.TabIndex - 1].text[i]);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
EpHeartBeat;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -