XDCC-Fetch 1.386
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +23 -0
- data/XDCC-Fetch.rbw +54 -0
- data/doc/ark.png +0 -0
- data/doc/connect_established.png +0 -0
- data/doc/index.html +300 -0
- data/doc/mega_ark.png +0 -0
- data/doc/package.png +0 -0
- data/doc/package_unknown.png +0 -0
- data/doc/shot1.png +0 -0
- data/doc/shot1_mini.png +0 -0
- data/doc/shot2.png +0 -0
- data/doc/shot2_mini.png +0 -0
- data/doc/xdccfetch.css +155 -0
- data/icons/ark.png +0 -0
- data/icons/ark_big.png +0 -0
- data/icons/camera_test.png +0 -0
- data/icons/cancel.png +0 -0
- data/icons/connect_creating.png +0 -0
- data/icons/connect_established.png +0 -0
- data/icons/connect_failed.png +0 -0
- data/icons/connect_no.png +0 -0
- data/icons/edit_add.png +0 -0
- data/icons/edit_remove.png +0 -0
- data/icons/exit.png +0 -0
- data/icons/fileclose.png +0 -0
- data/icons/folder_inbox.png +0 -0
- data/icons/idea.png +0 -0
- data/icons/mega_ark.png +0 -0
- data/icons/messagebox_critical.png +0 -0
- data/icons/messagebox_info.png +0 -0
- data/icons/messagebox_warning.png +0 -0
- data/icons/messagebox_warning_small.png +0 -0
- data/icons/package.png +0 -0
- data/icons/package_favourite.png +0 -0
- data/icons/package_unknown.png +0 -0
- data/src/Console/Console_Parser.rb +71 -0
- data/src/Console/XDCC_Pack_Match_Template.rb +29 -0
- data/src/Console/xdcc-fetch.rb +123 -0
- data/src/GUI/About_Dialog.rb +50 -0
- data/src/GUI/Application_Builder.rb +280 -0
- data/src/GUI/Context_Menu.rb +81 -0
- data/src/GUI/Custom_Tabs.rb +60 -0
- data/src/GUI/Dialog_Box.rb +116 -0
- data/src/GUI/Download_Finished_Box.rb +41 -0
- data/src/GUI/Empty_Text_Field_Handler.rb +86 -0
- data/src/GUI/Gui_Logic.rb +629 -0
- data/src/GUI/Icon_Loader.rb +58 -0
- data/src/GUI/Main_Window.rb +227 -0
- data/src/GUI/Packet_Item.rb +171 -0
- data/src/GUI/Packet_List.rb +145 -0
- data/src/GUI/Speed_Widget.rb +101 -0
- data/src/GUI/Talk_Back.rb +118 -0
- data/src/GUI/Toggle_Button.rb +56 -0
- data/src/Network/CTCP_Handler.rb +61 -0
- data/src/Network/DCC_File.rb +323 -0
- data/src/Network/DCC_Parser.rb +71 -0
- data/src/Network/IPAddr_Ext.rb +76 -0
- data/src/Network/IRC_Message.rb +161 -0
- data/src/Network/IRC_Server.rb +273 -0
- data/src/Network/IRC_Server_Respond_Map.rb +223 -0
- data/src/Network/IRC_User.rb +58 -0
- data/src/Network/TCP_Connection.rb +168 -0
- data/src/Network/XDCC_Announcement.rb +120 -0
- data/src/Network/XDCC_Announcement_Storage.rb +167 -0
- data/src/Network/XDCC_Download_Handler.rb +412 -0
- data/src/Network/XDCC_Pack.rb +58 -0
- data/src/Network/XDCC_Parser.rb +253 -0
- data/src/Translations/README +61 -0
- data/src/Translations/check_translations +83 -0
- data/src/Translations/de.rb +140 -0
- data/src/Translations/en.rb +145 -0
- data/src/Utilities/Configuration.rb +91 -0
- data/src/Utilities/Events.rb +87 -0
- data/src/Utilities/Globals.rb +138 -0
- data/src/Utilities/PrettyException.rb +1091 -0
- data/src/Utilities/Recursive_Open_Struct.rb +159 -0
- data/src/Utilities/Timer.rb +71 -0
- metadata +135 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
# Copyright (c) 2004, 2005 Martin Ankerl
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice, this list
|
8
|
+
# of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
# of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
# provided with the distribution.
|
12
|
+
# * Neither the name of Martin Ankerl nor the names of its contributors may be used to
|
13
|
+
# endorse or promote products derived from this software without specific prior written
|
14
|
+
# permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
17
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
18
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
19
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
22
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
23
|
+
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
require 'set'
|
26
|
+
require 'src/GUI/Packet_Item'
|
27
|
+
|
28
|
+
# Packet_List is a more convenient wrapper for FXIconList. This class has to be used
|
29
|
+
# in combination with Packet_Item.
|
30
|
+
class Packet_List < FXIconList
|
31
|
+
include Responder
|
32
|
+
|
33
|
+
# Create a new Packet_List. All parameters are passed to the parental constructor FXIconList.
|
34
|
+
def initialize(variables, *args)
|
35
|
+
@variables = variables
|
36
|
+
@sort_mutex = Mutex.new
|
37
|
+
@sort_thread = nil
|
38
|
+
if FOXVERSION=="1.0"
|
39
|
+
def getItem(num)
|
40
|
+
retrieveItem(num)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
@header_item_index = 0
|
45
|
+
@reversed = false
|
46
|
+
@conversions = Array.new
|
47
|
+
@items = Set.new
|
48
|
+
super(*args)
|
49
|
+
|
50
|
+
header.connect(SEL_COMMAND) do |sender, sel, item_number|
|
51
|
+
on_cmd_header(item_number)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Called whenever a header is clicked
|
56
|
+
def on_cmd_header(header_item_index)
|
57
|
+
@variables.gui_mutex.synchronize do
|
58
|
+
header.setArrowDir(@header_item_index, MAYBE)
|
59
|
+
if @header_item_index == header_item_index
|
60
|
+
@reversed = !@reversed
|
61
|
+
else
|
62
|
+
@reversed = false
|
63
|
+
end
|
64
|
+
@header_item_index = header_item_index
|
65
|
+
header.setArrowDir(@header_item_index, @reversed)
|
66
|
+
sortItems
|
67
|
+
end
|
68
|
+
|
69
|
+
return 0
|
70
|
+
end
|
71
|
+
|
72
|
+
def sortItems
|
73
|
+
@items.each do |item|
|
74
|
+
item.update_sort_key
|
75
|
+
end
|
76
|
+
super
|
77
|
+
end
|
78
|
+
|
79
|
+
# Check if the search order is reversed (happens when clicking on the same header twice)
|
80
|
+
def reversed?
|
81
|
+
@reversed
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get index of the header that should be used for sorting
|
85
|
+
def sort_index
|
86
|
+
@header_item_index
|
87
|
+
end
|
88
|
+
|
89
|
+
# Add a new header. The block that you need to specify is used to convert a string of this
|
90
|
+
# column into something that can be used for sorting. The yielded parameter item_colum_text
|
91
|
+
# is the text of one item of this column.
|
92
|
+
def add_header(text, width, &conversion) # :yields: item_column_text
|
93
|
+
appendHeader(text, nil, width)
|
94
|
+
header.setArrowDir(0, false) if @conversions.empty?
|
95
|
+
@conversions.push conversion
|
96
|
+
end
|
97
|
+
|
98
|
+
# Create a new Packet_Item. After the icon, you can specify the text for each of the columns.
|
99
|
+
# Here is an example:
|
100
|
+
# list.create_item(my_icon, "Martin", "Ankerl", "2005")
|
101
|
+
def create_item(icon, *args)
|
102
|
+
Packet_Item.new(self, icon, *args)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Add a new Packet_Item to this list.Called from within Packet_Item during Packet_Item#parent=
|
106
|
+
def add_item(item)
|
107
|
+
@items.add item
|
108
|
+
appendItem(item.fox_item)
|
109
|
+
item
|
110
|
+
end
|
111
|
+
|
112
|
+
# Remove the given Packet_Item from the list. This is slow, because
|
113
|
+
# the item has to be searched with a linear search. To remove all items
|
114
|
+
# use #clear.
|
115
|
+
def remove_item(item)
|
116
|
+
i = 0
|
117
|
+
@items.delete item
|
118
|
+
fox_item = item.fox_item
|
119
|
+
i += 1 while i < numItems && fox_item != getItem(i)
|
120
|
+
removeItem(i) if i < numItems
|
121
|
+
item
|
122
|
+
end
|
123
|
+
|
124
|
+
# Removes all items from the list.
|
125
|
+
def clear
|
126
|
+
@items.each { |item| item.clear }
|
127
|
+
@items.clear
|
128
|
+
# todo: mutex!?
|
129
|
+
clearItems
|
130
|
+
end
|
131
|
+
|
132
|
+
# use in combination with Packet_Item#show
|
133
|
+
def dirty_clear
|
134
|
+
clearItems
|
135
|
+
@items.clear
|
136
|
+
end
|
137
|
+
|
138
|
+
# Get the sort for a given header index. The sort function has been supplied
|
139
|
+
# when calling #new. This is used from Packet_Item.
|
140
|
+
def sort_function(header_item_index)
|
141
|
+
@conversions[header_item_index]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# Copyright (c) 2004, 2005 Martin Ankerl
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice, this list
|
8
|
+
# of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
# of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
# provided with the distribution.
|
12
|
+
# * Neither the name of Martin Ankerl nor the names of its contributors may be used to
|
13
|
+
# endorse or promote products derived from this software without specific prior written
|
14
|
+
# permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
17
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
18
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
19
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
22
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
23
|
+
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
# Speed_Widget is a widget to display the download speed. The widget shows the average
|
26
|
+
# average download speed.
|
27
|
+
class Speed_Widget
|
28
|
+
|
29
|
+
# Create a new widget in parent with given width. The specified block is used to convert an
|
30
|
+
# integer value into a string that is used to display the current average speed. The widget
|
31
|
+
# updates itself every 0.5 second.
|
32
|
+
def initialize(parent, width, init_text, &proc) # :yields: current_speed
|
33
|
+
@updateMutex = Mutex.new
|
34
|
+
@val_to_str = proc
|
35
|
+
@max = 10000
|
36
|
+
@slowness = 0.95
|
37
|
+
FXHorizontalFrame.new(parent, FRAME_SUNKEN|LAYOUT_FILL_Y, 0,0,0,0, 1,1,1,1,1,1) do |frame|
|
38
|
+
@progress = FXProgressBar.new(frame, nil, 0, LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH) do |progress|
|
39
|
+
progress.width = width
|
40
|
+
progress.total = @max
|
41
|
+
end
|
42
|
+
@label = FXLabel.new(frame, init_text, nil, JUSTIFY_CENTER_Y|JUSTIFY_RIGHT|LAYOUT_FIX_WIDTH) do |label|
|
43
|
+
label.width = 60
|
44
|
+
end
|
45
|
+
end
|
46
|
+
@highest_val = 0
|
47
|
+
@value = 0.0
|
48
|
+
@values = Hash.new
|
49
|
+
|
50
|
+
@updater = Thread.new do
|
51
|
+
loop do
|
52
|
+
update
|
53
|
+
sleep(0.1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Specify how slow adapting is, a value from 0 to 1.
|
59
|
+
# 0.0: instantaneously
|
60
|
+
# 0.5: medium
|
61
|
+
# 0.9: extremely slow
|
62
|
+
def slowness=(slowness)
|
63
|
+
@slowness = slowness
|
64
|
+
end
|
65
|
+
|
66
|
+
# The widget uses multiple sources for the average speed. All values specified here are summed
|
67
|
+
# up.
|
68
|
+
def []=(key, val)
|
69
|
+
@values[key] = val
|
70
|
+
end
|
71
|
+
|
72
|
+
# Remove a source.
|
73
|
+
def delete(key)
|
74
|
+
@values.delete(key)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
# update is called every 0.1 second.
|
80
|
+
def update
|
81
|
+
@updateMutex.synchronize do
|
82
|
+
# sum up values
|
83
|
+
new_value = 0
|
84
|
+
@values.each_value do |val|
|
85
|
+
new_value += val
|
86
|
+
end
|
87
|
+
# update top value
|
88
|
+
@highest_val = new_value if (new_value > @highest_val)
|
89
|
+
return if @highest_val == 0
|
90
|
+
# exponentally adapt to new value
|
91
|
+
last_value = @value
|
92
|
+
@value = @value*@slowness + new_value*(1-@slowness)
|
93
|
+
# nothing to do if value has not changed
|
94
|
+
return if @value == last_value
|
95
|
+
# calc + set progress bar size
|
96
|
+
@progress.progress = (1.0 * @max / @highest_val * @value).to_i
|
97
|
+
# set text
|
98
|
+
@label.text = @val_to_str.call(new_value)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# Copyright (c) 2004, 2005 Martin Ankerl
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice, this list
|
8
|
+
# of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
# of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
# provided with the distribution.
|
12
|
+
# * Neither the name of Martin Ankerl nor the names of its contributors may be used to
|
13
|
+
# endorse or promote products derived from this software without specific prior written
|
14
|
+
# permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
17
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
18
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
19
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
22
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
23
|
+
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
require 'fox'
|
26
|
+
|
27
|
+
include Fox
|
28
|
+
|
29
|
+
require 'src/Utilities/Globals'
|
30
|
+
|
31
|
+
|
32
|
+
# Unfortunately Talk_Back only works for email server that allow non-secure connections,
|
33
|
+
# and therefore is useless. Let's wait until smtp supports everything requird.
|
34
|
+
class Talk_Back < FXDialogBox
|
35
|
+
def Talk_Back.run(err)
|
36
|
+
$main_window.hide if $main_window
|
37
|
+
app = FXApp.instance || FXApp.new($cfg.talkback.name, $cfg.talkback.name)
|
38
|
+
app.create
|
39
|
+
main = $main_window || FXMainWindow.new(FXApp.instance, $cfg.talkback.name)
|
40
|
+
main.hide
|
41
|
+
puts err.backtrace
|
42
|
+
tb = Talk_Back.new(app, err)
|
43
|
+
tb.execute
|
44
|
+
app.run
|
45
|
+
end
|
46
|
+
|
47
|
+
def initialize(app, err)
|
48
|
+
super(app, $cfg.talkback.name, DECOR_ALL, 0, 0, 400, 400)
|
49
|
+
@err = err
|
50
|
+
@time = Time.now
|
51
|
+
build_controls
|
52
|
+
end
|
53
|
+
|
54
|
+
def create
|
55
|
+
super
|
56
|
+
if dialog == MBOX_CLICKED_OK
|
57
|
+
show(PLACEMENT_SCREEN)
|
58
|
+
else
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_controls
|
64
|
+
FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y) do |main|
|
65
|
+
FXLabel.new(main, "1. Specify your email, if you want an response:", nil, LABEL_NORMAL)
|
66
|
+
@addr = FXTextField.new(main, 1, nil, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|FRAME_SUNKEN) do |addr|
|
67
|
+
addr.text = "anonymous@unknown.com"
|
68
|
+
end
|
69
|
+
FXLabel.new(main, "2. If possible, describe how you got this crash:", nil, LABEL_NORMAL)
|
70
|
+
FXHorizontalFrame.new(main, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN, 0,0,0,0, 0,0,0,0,0,0) do |textframe|
|
71
|
+
@user_desc = FXText.new(textframe, nil, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y) do |user_desc|
|
72
|
+
user_desc.text = "1. Steps to reproduce\n\n\n\n"
|
73
|
+
user_desc.text += "2. Steps to reproduce\n\n\n\n"
|
74
|
+
user_desc.text += "3. Steps to reproduce\n\n\n\n"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
FXLabel.new(main, "When you click 'Send', an email is sent to\nxdcctest@gmail.com that contains your specified\ninformation and a stack trace. No other private\ninformation is sent.", nil, JUSTIFY_LEFT|ICON_BEFORE_TEXT)
|
79
|
+
|
80
|
+
FXHorizontalSeparator.new(main)
|
81
|
+
|
82
|
+
FXHorizontalFrame.new(main, LAYOUT_FILL_X) do |buttonframe|
|
83
|
+
@send_btn = FXButton.new(buttonframe, $cfg.text.submit, nil, nil, 0, BUTTON_NORMAL|LAYOUT_CENTER_X)
|
84
|
+
@send_btn.connect(SEL_COMMAND) { on_cmd_send }
|
85
|
+
@cancel_btn = FXButton.new(buttonframe, $cfg.text.cancel , nil, nil, 0, BUTTON_NORMAL|LAYOUT_CENTER_X)
|
86
|
+
@cancel_btn.connect(SEL_COMMAND) { exit }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
def dialog
|
93
|
+
FXMessageBox.error(self, MBOX_OK_CANCEL, $cfg.talkback.name, $cfg.text.talkback.preamble)
|
94
|
+
end
|
95
|
+
|
96
|
+
def on_cmd_send
|
97
|
+
subject = "[BUG] #{$cfg.app.version}, Revision #{$cfg.app.revision}, #{@time}"
|
98
|
+
text = @user_desc.text
|
99
|
+
text += "\n\n-------------------\n\n"
|
100
|
+
text += `ruby --version` + "\n"
|
101
|
+
text += "FXRuby #{Fox.fxrubyversion}"
|
102
|
+
text += "\n\n-------------------\n\n"
|
103
|
+
text += "Version: #{$cfg.app.version}\n"
|
104
|
+
text += "Revision: #{$cfg.app.revision}\n\n"
|
105
|
+
text += @err.message + "\n" + @err.backtrace.join("\n")
|
106
|
+
|
107
|
+
msg = ["Subject: " + subject + "\n", "\n", text+"\n"]
|
108
|
+
recipients = [ "martin.ankerl@fh-hagenberg.at" ] #"xdcctest@gmail.com" ]
|
109
|
+
|
110
|
+
puts text
|
111
|
+
|
112
|
+
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
|
113
|
+
Net::SMTP.start("mailse.fh-hagenberg.at") do |smtp|
|
114
|
+
smtp.sendmail(msg, @addr.text.strip, recipients)
|
115
|
+
end
|
116
|
+
exit
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2004, 2005 Christoph Heindl and Martin Ankerl
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice, this list
|
8
|
+
# of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
# of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
# provided with the distribution.
|
12
|
+
# * Neither the name of Christoph Heindl and Martin Ankerl nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software without specific
|
14
|
+
# prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
17
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
18
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
19
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
22
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
23
|
+
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
# A button that uses the state (down, up) to display if it is enabled or not.
|
26
|
+
# the specified proc is executed
|
27
|
+
class Toggle_Button
|
28
|
+
|
29
|
+
# Creates a new toggle button. The specified block is called with the new toggle status whenever the button is clicked.
|
30
|
+
def initialize(parent, icon, text, toggled, &proc) # :yields: new_toggle_status
|
31
|
+
@btn = FXButton.new(parent, text, icon, nil, 0, FRAME_RAISED)
|
32
|
+
@toggled = toggled
|
33
|
+
@proc = proc
|
34
|
+
@btn.connect(SEL_COMMAND) do |sender, sel, data|
|
35
|
+
@toggled = !@toggled
|
36
|
+
on_toggle(@toggled)
|
37
|
+
@proc.call(@toggled) if @proc
|
38
|
+
end
|
39
|
+
on_toggle(@toggled)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Check if the button is toggled (status down)
|
43
|
+
def toggled?
|
44
|
+
@toggled
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def on_toggle(status)
|
50
|
+
if status
|
51
|
+
@btn.state = STATE_DOWN
|
52
|
+
else
|
53
|
+
@btn.state = STATE_UP
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Copyright (c) 2005, Christoph Heindl
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
# are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright notice, this list
|
8
|
+
# of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright notice, this list
|
10
|
+
# of conditions and the following disclaimer in the documentation and/or other materials
|
11
|
+
# provided with the distribution.
|
12
|
+
# * Neither the name of Christoph Heindl nor the names of its contributors may be used to
|
13
|
+
# endorse or promote products derived from this software without specific prior written
|
14
|
+
# permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
17
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
18
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
19
|
+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
21
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
22
|
+
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
23
|
+
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
# Parses extended ctcp queries and response appropriately if allowed to.
|
26
|
+
# Queries by the user itself (commands) are not supported (why should they?)
|
27
|
+
# as of now.
|
28
|
+
class CTCP_Handler
|
29
|
+
|
30
|
+
def initialize(irc_server)
|
31
|
+
@irc_server = irc_server
|
32
|
+
@irc_server.connect_to_events(IRC_Server::ON_USER_MESSAGE, self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def shutdown
|
36
|
+
@irc_server.disconnect_from_events(IRC_Server::ON_USER_MESSAGE, self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_event(irc_server, eventtype, eventargs)
|
40
|
+
irc_user, message, targets, irc_msg = eventargs
|
41
|
+
if (@irc_server.me.has_name?(targets[0]))
|
42
|
+
if irc_msg.ctcp_command?
|
43
|
+
return unless $cfg.network.ctcp.enable_replies
|
44
|
+
case (irc_msg.parameters[-1])
|
45
|
+
when "VERSION"
|
46
|
+
irc_user.notice("\001VERSION #{$cfg.app.name}:#{$cfg.app.revision}:#{RUBY_PLATFORM}\001")
|
47
|
+
when "SOURCE"
|
48
|
+
irc_user.notice("\001SOURCE #{$cfg.app.url}::\001")
|
49
|
+
irc_user.notice("\001SOURCE\001")
|
50
|
+
when "PING"
|
51
|
+
# Just sent back received string
|
52
|
+
irc_user.notice(message)
|
53
|
+
when "TIME"
|
54
|
+
irc_user.notice("\001#{Time.now}\001")
|
55
|
+
when "USERINFO"
|
56
|
+
irc_user.notice("\001USERINFO :no way\001")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|